从行具有最大日期的表中选择信息
Posted
技术标签:
【中文标题】从行具有最大日期的表中选择信息【英文标题】:Select info from table where row has max date 【发布时间】:2013-10-26 07:24:24 【问题描述】:我的桌子看起来像这样:
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
【问题讨论】:
可能重复***.com/questions/612231/… 避免使用“组”等特殊词作为列... SQL Server: SELECT only the rows with MAX(DATE)的可能重复 【参考方案1】:使用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
【讨论】:
【参考方案2】:SELECT distinct
group,
max_date = MAX(date) OVER (PARTITION BY group), checks
FROM table
应该可以。
【讨论】:
这不是一个答案。请提供有关您的查询的更多信息。【参考方案3】: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
内连接用作过滤器,仅获取最大记录。
仅供参考,您的列名很糟糕,请勿对列(组、日期、表格)使用保留字。
【讨论】:
Select group,max_date,check
列名中的错字为“checks”。让我有点困惑这里的检查是做什么的。
+1,我的表 =>(ID,group_ID,DateColumn),我需要获取 Max(ID) 相对于 group_ID 的日期值。成功了!【参考方案4】:
您可以像这样使用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
将上述输出用作派生表,然后您只能获取 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's suggestion,但避免了连接,因此可能更有效。
你可以试试at SQL Fiddle的方法。
【讨论】:
以上是关于从行具有最大日期的表中选择信息的主要内容,如果未能解决你的问题,请参考以下文章