2012-07-15 7 views
3

나는 새 테이블에 최소 및 최대 타임 스탬프와 함께 행을 작성하는 다음과 같은 코드를 가지고 : 그것은 그러나 거기 C2G 테이블의 다른 도시에 대한 부분 집합은 나는 것 잘 작동부분 집합 SELECT DISTINCT

sql_sort_and_delete = """ 
       CREATE TABLE tmp AS 
       SELECT DISTINCT * FROM c2g 
       WHERE time = (SELECT max(time) FROM c2g) 
       UNION SELECT DISTINCT * FROM c2g 
       WHERE time = (SELECT min(time) FROM c2g);;""" 

코드를 변경하여 각 도시에 대한 최소/최대 결과를 구별합니다. 쉬운 방법이 있나요? 감사!

+1

http://sqlfiddle.com을 사용하여 테이블 구조를 추가하십시오 더 좋을 것입니다;) – alfasin

+0

소프트웨어 용 태그를 추가 하시겠습니까? sql-server/mysql/...? – whytheq

답변

1

도시 당 집계 MIN()/MAX()을 얻으려면 GROUP BY city을 사용하십시오. 나머지 열을 c2g에서 가져 오려면 도시 및 시간 값에 대한 하위 쿼리에 대해 기본 테이블 INNER JOIN이 필요합니다.

SELECT DISTINCT c2g.* 
FROM 
    c2g 
    INNER JOIN (SELECT city, MAX(time) AS time FROM c2g GROUP BY city) maxtime 
    ON c2g.city = maxtime.city AND c2g.time = maxtime.time 
UNION 
SELECT DISTINCT c2g.* 
FROM 
    c2g 
    INNER JOIN (SELECT city, MIN(time) AS time FROM c2g GROUP BY city) mintime 
    ON c2g.city = mintime.city AND c2g.time = mintime.time 

나는이 간단하게 할 수 있다고 생각하고 실제로의 가입 ON 상태에 OR을 사용하여 UNION없이 작동합니다 : 대부분의 데이터베이스에서

SELECT DISTINCT c2g.* 
FROM 
    c2g 
    INNER JOIN (SELECT city, MAX(time) AS maxtime, MIN(time) AS mintime FROM c2g GROUP BY city) maxtime 
    ON c2g.city = maxtime.city AND (c2g.time = maxtime.time OR c2g.time = maxtime.mintime) 
1

, 당신은 또한 윈도우 기능을 수행 할 수 있습니다,

select c.* 
from (select cg.*, 
      max(time) over (partition by city) as maxtime, 
      min(time) over (partition by city) as mintime 
     from c2g 
    ) c 
where time = maxtime or time = mintime 

(이것은 분명히 mysql이나 Access에서는 작동하지 않습니다. t 창 기능) 약간 아니면 CTE으로이 코딩의 유효한 방법 일을 복잡 이상 어쩌면

2

:.

SQL FIDDLE EXAMPLE

CREATE TABLE c2g 
    ( 
    CITY varchar(20), 
    TIME INT 
    ); 

INSERT INTO c2g 
(CITY, TIME) 
VALUES 
('A', 1), 
('A', 2), 
('B', 2), 
('B', 2), 
('B', 2), 
('B', 2), 
('C', 1), 
('C', 2), 
('C', 5), 
('C', 20); 

이 요구하려면 기록 :

WITH CITY_cte(CITY, myMAX, myMIN) 
AS 
(
    SELECT 
     CITY 
     ,MAX(TIME) 
     ,MIN(TIME) 
    FROM c2g 
    GROUP BY CITY 
) 
SELECT x.* 
FROM 
    c2g x 
    INNER JOIN CITY_cte y 
     ON x.CITY = y.CITY 
WHERE 
    x.TIME = y.myMAX 
    OR 
    x.TIME = y.myMIN 
-1
SELECT City, MAX(Time) 
FROM cg 
GROUP BY City 
UNION 
SELECT City, MIN(Time) 
FROM cg 
GROUP BY City