为了账号安全,请及时绑定邮箱和手机立即绑定

从表格中选择信息,其中行具有最大日期

从表格中选择信息,其中行具有最大日期

慕森王 2019-12-27 12:50:06
我的桌子看起来像这样: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 2005sql -sql-server-2005 great-n-per-group
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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

内部联接用作仅获取最大记录的过滤器。


仅供参考,您的列名很恐怖,请不要在列(组,日期,表)中使用保留字。


查看完整回答
反对 回复 2019-12-27
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

您可以像这样使用窗口 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中尝试该方法。


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 675 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信