Sql server 对不在group by列表中的列进行聚合
例如,我有下表:Sql server 对不在group by列表中的列进行聚合,sql-server,tsql,Sql Server,Tsql,例如,我有下表: declare @table table(val int, dt datetime) insert into @table values (10, '2018-3-20 16:00'), (12, '2018-3-20 14:00'), (14, '2018-3-20 12:00'), (16, '2018-3-20 10:00'), (10, '2018-3-19 14:00'), (12, '2018-3-19 12:00'), (14, '2018-3-19 10:00'
declare @table table(val int, dt datetime)
insert into @table values
(10, '2018-3-20 16:00'),
(12, '2018-3-20 14:00'),
(14, '2018-3-20 12:00'),
(16, '2018-3-20 10:00'),
(10, '2018-3-19 14:00'),
(12, '2018-3-19 12:00'),
(14, '2018-3-19 10:00'),
(10, '2018-3-18 12:00'),
(12, '2018-3-18 10:00')
我尝试使用group by中的列进行聚合,没有问题:
select day, MAX(val) as max_by_value from
(
select DATEPART(DAY, dt) as day, val from @table
) q
group by day
它返回:
day max_by_value
18 12
19 14
20 16
现在我需要一天中某个时间的最大值,所以我每天需要10个作为结果。 我尝试在上使用
,但它说,列'@table.dt'在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。
select DATEPART(DAY, dt), MAX(val) as max_by_value
,ROW_NUMBER() over (partition by DATEPART(DAY, dt) order by dt desc) as max_by_date
from @table
group by DATEPART(DAY, dt)
我明白为什么会出现这个错误,但不知道如何解决我的问题。您能帮我找到一些方法来填写[max\u by\u date]
栏吗
因此,我期望得到以下结果:
day max_by_value max_by_time
18 12 10
19 14 10
20 16 10
从2012版开始,您可以使用窗口功能:
SELECT DISTINCT DATEPART(DAY, dt),
MAX(val) OVER (partition by DATEPART(DAY, dt)) as max_by_value,
FIRST_VALUE(val) OVER (partition by DATEPART(DAY, dt) order by dt desc) as max_by_date
FROM @table
注意:我对MAX
函数使用了OVER
子句,而不是使用groupby
对于2008版本,您可以改用子查询:
SELECT DISTINCT DATEPART(DAY, dt),
MAX(val) OVER (partition by DATEPART(DAY, dt)) as max_by_value,
(
SELECT TOP 1 val
FROM @table as t1
WHERE DATEPART(DAY, t1.dt) = DATEPART(DAY, t0.dt)
ORDER BY dt DESC
) as max_by_date
FROM @table as t0
“现在我需要在一天中的某个时间获得最大值”。除非我遗漏了什么,只需按dt
…同时我需要3列-[day]、[max\u by\u value]、[max\u by\u time]
我不确定我是否遵循了。请编辑您的问题,以包含所需的结果。完成后,文本中描述了“因此我每天需要10个结果”,非常感谢。我只是担心性能。由于有大量计算记录将被distinct
删除,因此这一事实似乎会影响性能。你认为呢?Distinct
肯定会减慢查询速度。您需要使用相关的卷对实际数据进行测试,看看这是否太慢。如果是,检查执行计划。是的,我会检查。无论如何,您知道如何更改查询以提高性能吗?我的桌子太大了,我相信如果可能的话,我需要更有效的方法。