where最大值 - sql最大值條件




從行中包含最大日期的表中選擇信息 (3)

我的表看起來像這樣:

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 server 2005


你可以像這樣使用join。 如果您使用IN,這將執行緩慢嘗試以避免它。

    SELECT *  FROM (SELECT  msisdn, callid, Change_color, play_file_name, date_played FROM insert_log
   WHERE play_file_name NOT IN('Prompt1','Conclusion_Prompt_1','silent')
 ORDER BY callid ASC) t1 JOIN (SELECT MAX(date_played) AS date_played FROM insert_log GROUP BY callid) t2 ON t1.date_played=t2.date_played

您可以使用這樣的window 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

使用上面的輸出作為派生表,您只能獲得datemax_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上嘗試該方法。


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

內部聯接用作過濾器以僅獲取最大記錄。

僅供參考,您的列名稱很可怕,不要對列(組,日期,表)使用保留字。





greatest-n-per-group