从行中包含最大日期的表中选择信息

kql*_*ert 49 sql sql-server-2005 greatest-n-per-group

我的表看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

- 不需要现金只是证明该表中有更多信息

我想得到每个唯一的组,其中日期是最大值,检查大于0.所以返回看起来像这样:

group    date     checks
  2    1/1/2013    800
  1    1/3/2013    700
  3    1/5/2013    200
Run Code Online (Sandbox Code Playgroud)

尝试代码:

SELECT group,MAX(date),checks
    FROM table
    WHERE checks>0
    GROUP BY group
    ORDER BY group DESC
Run Code Online (Sandbox Code Playgroud)

问题虽然它给了我所有的日期和检查,而不仅仅是最大日期行.

使用ms sql server 2005

Twe*_*fth 121

SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group
Run Code Online (Sandbox Code Playgroud)

这样可以获得最大日期..加入数据以获取其他列:

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
Run Code Online (Sandbox Code Playgroud)

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

仅供参考,您的列名称很可怕,不要对列(组,日期,表)使用保留字.

  • `Select group,max_date,check` 列名称中的拼写错误是“checks”。让我有点困惑检查在这里做什么。 (2认同)

And*_*y M 28

您可以使用这样的窗口 MAX():

SELECT
  *, 
  max_date = MAX(date) OVER (PARTITION BY group)
FROM table
Run Code Online (Sandbox Code Playgroud)

获得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
Run Code Online (Sandbox Code Playgroud)

使用上面的输出作为派生表,您只能获得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
;
Run Code Online (Sandbox Code Playgroud)

获得理想的结果.

基本上,这类似于@Trelfth的建议,但避免了连接,因此可能更有效.

您可以在SQL Fiddle上尝试该方法.


kin*_*neo 5

使用 anin会对性能产生影响。加入两个子查询不会有相同的性能影响,可以这样完成:

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
Run Code Online (Sandbox Code Playgroud)


小智 5

SELECT distinct
  group, 
  max_date = MAX(date) OVER (PARTITION BY group), checks
FROM table
Run Code Online (Sandbox Code Playgroud)

应该管用。