2013-08-22 5 views
1

자기 조인을 사용하지 않고 이와 같은 문제를 해결할 수있는 방법이 있습니까? min() 함수를 사용하는 방법은 무엇입니까?최소 날짜가있는 행의 모든 ​​열을 검색 하시겠습니까?

열 c1과 c2의 각 그룹에 대해 첫 번째 과일 항목을 가져오고 싶습니다. 여기

DROP TABLE IF EXISTS test; 
CREATE TABLE test 
(
    c1 varchar(25), 
    c2 varchar(25), 
    fruit varchar(25), 
    currentTime Datetime 
); 
INSERT INTO test VALUES  
('a','b','pineapple','2013-01-28 20:50:00'), 
('a','b','papaya','2013-01-28 20:49:00'), 
('a','b','pear','2013-01-28 20:51:00'), 
('a','c','peach','2013-01-28 18:12:00'),  
('a','c','plum','2013-01-28 20:40:00'), 
('a','c','pluot','2013-01-28 16:50:00'); 

내 현재 쿼리입니다 (날짜가 동일하지 않을 수 있습니다 가정) :

SELECT t2.* 
    FROM (SELECT c1, 
       c2, 
       MIN(currentTime) AS ct 
      FROM test 
     GROUP BY c1, c2) as t1 
    JOIN test t2 
    ON t1.c1 = t2.c1 AND 
     t1.c2 = t2.c2 AND 
     t2.currentTime = t1.ct 

이 각 c1/c2 쌍에 대한 초기 항목을 얻을 수 있지만, min()를 사용하고 가입 자체를 방지하는 방법은 무엇입니까 ? 당신이뿐만 아니라 fruit 열을 얻을하려는 경우

+1

MIN이 나머지 쿼리와 함께 작동하지 않으므로 조인/하위 쿼리없이 MIN으로 만 아카이브 할 수 있다고 생각하지 않습니다. 따라서 min의 결과는 자체에서 발생하며 나머지 쿼리에는 영향을주지 않습니다 그 자체. – Prix

답변

1

대답은 "예"입니다. 집계 만하면됩니다. 이것은 당신의 SQL 바이올린에서 테스트되었습니다

select c1, c2, 
     substring_index(group_concat(fruit order by currentTime), ',', 1) as fruit, 
     min(currentTime) 
from test 
group by c1, c2; 

: 열쇠는 첫 열매를 얻기 위해 group_concat()/substring_index() 트릭을 사용하는 것입니다.

+0

와우, 그런 말 한 번도 안 들려. 꽤 달콤하고 쉬운 구문. 고마워요. 투표 하겠지만 조금 더 평판이 필요합니다. – JackhammersForWeeks

0
SELECT c1, 
     c2, 
     currentTime AS ct 
    FROM test 
GROUP BY c1,c2 
HAVING MIN(ct) 

또는 시도 :

SELECT c1, 
     c2, 
     fruit, 
     currentTime AS ct 
    FROM test 
GROUP BY c1,c2 
HAVING MIN(ct) 
+0

'과일'칼럼도 갖고 싶습니다. 이 열을 포함 할 때 작동하지 않는 것 같습니다. 나는 그 길을 찾아 낼 수가 없었다. – JackhammersForWeeks

+0

정답은 – JackhammersForWeeks

+0

'| a | b | 파파야 | 2013-01-28 20:49:00 | | a | c | pluot | 2013-01-28 16:50:00 |' – JackhammersForWeeks

0

내가 바로하지만 당신을 이해하면 나도 몰라 :

SELECT * 
    FROM test 
WHERE currentTime IN (SELECT MIN(currentTime) FROM test) 
+0

OP는 "자체 조인"이없는 해결책을 요구했습니다. 답변에 원래 표를 참조하는 하위 쿼리가 있습니다. 본질적으로 조인입니다. – zamnuts

0

이 방법에 대해 :

SELECT 
    * 
FROM 
    test 
ORDER BY 
    currentTime 
LIMIT 
    1; 

겠습니까 당신의 목적을 위해이 작품?

관련 문제