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)
内部联接用作过滤器以仅获取最大记录.
仅供参考,您的列名称很可怕,不要对列(组,日期,表)使用保留字.
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上尝试该方法.
使用 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)
应该管用。
| 归档时间: |
|
| 查看次数: |
304632 次 |
| 最近记录: |