80

私のテーブルは次のようになります。

group    date      cash  checks
  1    1/1/2013     0      0
  2    1/1/2013     0      800
  1    1/3/2013     0      700
  3    1/1/2013     0      600
  1    1/2/2013     0      400
  3    1/5/2013     0      200

-- テーブルにさらに多くの情報が含まれていることを証明するだけの現金は必要ありません

日付が最大で、チェックが 0 より大きい各一意のグループを取得したいので、戻り値は次のようになります。

group    date     checks
  2    1/1/2013    800
  1    1/3/2013    700
  3    1/5/2013    200

試行されたコード:

SELECT group,MAX(date),checks
    FROM table
    WHERE checks>0
    GROUP BY group
    ORDER BY group DESC

ただし、最大日付行だけでなく、すべての日付とチェックが表示されるという問題があります。

ms sqlサーバー2005を使用

4

4 に答える 4

164
SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group

それは最大の日付を取得するために機能します..データに結合して他の列を取得します:

Select group,max_date,checks
from table t
inner join 
(SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group)a
on a.group = t.group and a.max_date = date

内部結合は、最大レコードのみを取得するフィルターとして機能します。

参考までに、列名はひどいです。列に予約語を使用しないでください(グループ、日付、テーブル)。

于 2013-10-17T17:11:44.717 に答える
47

次のようにウィンドウMAX()を使用できます。

SELECT
  *, 
  max_date = MAX(date) OVER (PARTITION BY group)
FROM table

group他のデータと一緒に最大日付を取得するには:

group  date      cash  checks  max_date
-----  --------  ----  ------  --------
1      1/1/2013  0     0       1/3/2013
2      1/1/2013  0     800     1/1/2013
1      1/3/2013  0     700     1/3/2013
3      1/1/2013  0     600     1/5/2013
1      1/2/2013  0     400     1/3/2013
3      1/5/2013  0     200     1/5/2013

上記の出力を派生テーブルとして使用すると、date一致する行のみを取得できmax_dateます。

SELECT
  group,
  date,
  checks
FROM (
  SELECT
    *, 
    max_date = MAX(date) OVER (PARTITION BY group)
  FROM table
) AS s
WHERE date = max_date
;

目的の結果を得るために。

基本的に、これは@Twelfth の提案に似ていますが、結合を回避するため、より効率的です。

SQL Fiddle でメソッドを試すことができます。

于 2013-10-28T08:46:53.033 に答える