2012-07-15 39 views
3

我有下面的代碼與最小和最大時間戳行寫入到一個新表:子集的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);;""" 

它工作正常,但也有在C2G表子集不同的城市,我會喜歡改變代碼,以便我得到每個城市不同的最小/最大結果。 有沒有簡單的方法來做到這一點?謝謝!

+1

請添加表結構,使用http://sqlfiddle.com會更好;) – alfasin 2012-07-15 18:23:48

+0

請爲軟件添加標籤? sql-server/mysql/...? – whytheq 2012-07-15 21:14:10

回答

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 

我認爲這是可以簡化,將沒有UNION通過使用加入的ON條件的OR實際工作:

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

在大多數數據庫中,你也可以使用Windows的功能做到這一點,通過做這樣的事情:

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工作,因爲他們不支持牛逼窗功能)

2

也許攻門稍稍高出也許複雜的事情CTE編碼本的一個有效途徑。

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