3

最小タイムスタンプと最大タイムスタンプの行を新しいテーブルに書き込むための次のコードがあります。

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テーブルにはさまざまな都市のサブセットがあり、都市ごとに異なる最小/最大の結果が得られるようにコードを変更したいと思います。これを行う簡単な方法はありますか?ありがとう!

4

4 に答える 4

2

物事を少し複雑にしすぎているか、これを次のようにコーディングする有効な方法かもしれませんCTE:

SQL フィドルの例

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 
于 2012-07-15T21:25:36.640 に答える
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を使用することで、実際には がなくても機能します。ORON

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)
于 2012-07-15T18:05:22.407 に答える
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

(これらは Windows の機能をサポートしていないため、これは mysql や Access では確実に機能しません。)

于 2012-07-15T19:34:04.787 に答える
-1
SELECT City, MAX(Time)
FROM cg
GROUP BY City
UNION
SELECT City, MIN(Time)
FROM cg
GROUP BY City
于 2012-07-15T23:03:37.773 に答える