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
肯定会减慢查询速度。您需要使用相关的卷对实际数据进行测试,看看这是否太慢。如果是,检查执行计划。是的,我会检查。无论如何,您知道如何更改查询以提高性能吗?我的桌子太大了,我相信如果可能的话,我需要更有效的方法。