从行具有最大日期的表中选择信息

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的方法。

【讨论】:

以上是关于从行具有最大日期的表中选择信息的主要内容,如果未能解决你的问题,请参考以下文章

从具有两个变量列的表中选择最大值(microsoft SQL)

从名称具有相同首字母的表中选择

SQL选择具有最大和最小日期的行

从具有联合的两个表中选择一列中最大值的所有行

如何从日期为最后一天的表中选择多列?

从 Sql 中的表中选择不同的日期间隔