Jam*_*uss 4 sql t-sql sql-server
我正在尝试编写一个查询,它将比较N行数的值,并仅返回具有最大值的行.例如,如果我只想返回一个包含非重复行的表,而只返回具有最新日期的行 -
key | name | value | date
1 | frank | 100 | 1/1/2013
2 | peter | 200 | 2/1/2013
3 | jonny | 300 | 3/1/2013
4 | jonny | 300 | 4/1/2013
Run Code Online (Sandbox Code Playgroud)
和查询:
SELECT key, name, value, MAX(date)
FROM myTable
WHERE key IN (1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
我期待着回归
key | name | value | date
1 | frank | 100 | 1/1/2013
2 | peter | 200 | 2/1/2013
4 | jonny | 300 | 4/1/2013
Run Code Online (Sandbox Code Playgroud)
我不确定如何使用GROUP BY,我想我错过了一些基本的尝试.
好吧,如果你只想要最新的行,你可以使用以下内容:
SELECT TOP 1 key, name, value, date
FROM myTable
ORDER BY date desc
Run Code Online (Sandbox Code Playgroud)
这应该返回该表中最新日期的一行.
如果您想要每个名称的最新日期,您可以使用group by:
SELECT name, max(date)
FROM myTable
WHERE key in(1,2,3,4)
GROUP BY name
Run Code Online (Sandbox Code Playgroud)
Max是一个聚合函数.无论何时使用聚合函数,都必须在group by子句中指定任何未聚合的列.
因此,根据您的预期结果,您可能需要这样:
;with namesWithMaxDate as(
select
name
,max(date) as date
from
myTable
group by
name
)
select
myTable.[key]
,myTable.name
,myTable.value
,myTable.date
from myTable
inner join
namesWithMaxDate
on
myTable.name = namesWithMaxDate.name and
myTable.date = namesWithMaxDate.date
Run Code Online (Sandbox Code Playgroud)
这稍微复杂一些,因为您希望返回的列不包含在分组中.因此,两个陈述到达最终结果集.
最终选项:良好的老式子查询.
select
myTable.[key]
,myTable.name
,myTable.value
,myTable.date
from myTable
inner join
( select
name
,max(date) as date
from
myTable
group by
name ) as namesWithMaxDate
on
myTable.name = namesWithMaxDate.name and
myTable.date = namesWithMaxDate.date
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47148 次 |
| 最近记录: |