如何编写查询以获取 SQL Server 中每个组的第一个条目? [复制]

Posted

技术标签:

【中文标题】如何编写查询以获取 SQL Server 中每个组的第一个条目? [复制]【英文标题】:How to write query to get 1st entry of each group in SQL Server? [duplicate] 【发布时间】:2021-02-14 21:30:41 【问题描述】:

我想获取每个日期每辆车的第一个里程表值。 我试过这个来启动里程表,但出现错误:

SELECT TOP 1 
    CAST(DateTime AS DATE) AS Date, RegistrationNo, OdoMeter AS StartOdometer 
FROM 
    EventsData 
GROUP BY 
    RegistrationNo, CAST(DateTime AS DATE) 
ORDER BY 
    RegistrationNo, DateTime

我收到此错误:

[SQL Server]列“EventsData.OdoMeter”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 (8120) (SQLExecDirectW)")

什么是正确的方法?请帮忙!

【问题讨论】:

请阅读how to create a minimal reproducible example 并添加一些示例数据、表结构和确切的错误消息,因为没人能猜到。 “但出现错误” - 什么错误?我在这个查询中看到了至少两个问题——一个是关键字作为标识符的广泛使用,另一个是DateTime 出现在order by 子句中但没有出现在group by 子句中(这可能是错误的原因)。 请阅读sql tag info 和edit 相应问题的指南。 【参考方案1】:

我想获取每个日期每辆车的第一个里程表值。

这是一个典型的每组最大 n 问题。一种选择使用窗口函数:

select *
from(
    select ed.*, 
        row_number() over(partition by registrationno, convert(date, datetime) order by datetime) rn
    from eventsdata ed
) ed
where rn = 1
order by registrationno, datetime

【讨论】:

@ZoharPeled 谢谢,如果我想要最后一个条目,那么我只需将顺序更改为降序对吗?

以上是关于如何编写查询以获取 SQL Server 中每个组的第一个条目? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

进行查找并编写查询以从 sql server 获取数据

SQL Server 查询需要从组中提取数据

如何避免两次编写 SQL Server 查询以避免重复?

如何编写 SQL 查询以获取具有相同前缀的行

如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行

如何编写sql查询为每个分组记录生成一个组号