Sql 使用分组依据时选择其他字段
我使用的是MSSQL 2008 R2,在以下情况下出现问题: 通过以下查询,我将获得预期的数据(每个日期的Sql 使用分组依据时选择其他字段,sql,sql-server,jpa,ebean,Sql,Sql Server,Jpa,Ebean,我使用的是MSSQL 2008 R2,在以下情况下出现问题: 通过以下查询,我将获得预期的数据(每个日期的max和min速度)。 CAST(m.date as date)删除我的datetime的时间部分 SELECT CAST(d.date as DATE) as date, MAX(d.speed) AS maxSpeed, AVG(d.speed) AS avgSpeed FROM Driver as d WHERE d.date between '201
max
和min
速度)。
CAST(m.date as date)
删除我的datetime的时间部分
SELECT CAST(d.date as DATE) as date,
MAX(d.speed) AS maxSpeed,
AVG(d.speed) AS avgSpeed
FROM Driver as d
WHERE d.date between '2014-01-01 09:00:00.491' and
'2014-03-11 17:00:00.491'
GROUP BY CAST(d.date as DATE)
ORDER BY date DESC
我的问题是,我还想从d
中选择一些其他字段(如userID、username等)。如果我修改查询以包含其他字段,如下所示:
SELECT CAST(d.date as DATE) as date,
MAX(d.speed) AS maxSpeed,
AVG(d.speed) AS avgSpeed,
d.userId
FROM Driver as d
WHERE d.date between '2014-01-01 09:00:00.491' and
'2014-03-11 17:00:00.491'
GROUP BY CAST(d.date as DATE)
ORDER BY date DESC
我得到这个错误:
d.userId is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
因此,我将d.userId
添加到groupby
子句中,当然,我的数据会发生变化,现在每个日期都会包含多个条目
因此,我的问题是,我如何选择其他字段,同时仍然保持我想要的原始数据(每个唯一日期的min
和max
)如果要从Driver
以及max()
和avg()
速度值中选择行,请使用窗口函数:
SELECT d.*, CAST(d.date as DATE) as date,
MAX(d.speed) OVER (PARTITION BY CAST(d.date as DATE)) AS maxSpeed,
AVG(d.speed) OVER (PARTITION BY CAST(d.date as date)) AS avgSpeed
FROM Driver as d
WHERE d.date between '2014-01-01 09:00:00.491' and '2014-03-11 17:00:00.491'
ORDER BY date DESC;
编辑:
如果您希望每个驱动程序每天有一行,请使用简单的分组方式
:
SELECT d.userId, CAST(d.date as DATE) as date,
MAX(d.speed) as maxSpeed, AVG(d.speed) as avgSpeed
FROM Driver as d
WHERE d.date between '2014-01-01 09:00:00.491' and '2014-03-11 17:00:00.491'
GROUP BY d.userId, CAST(d.date as DATE)
ORDER BY date DESC;
如果要添加其他列,则需要将它们同时添加到select
和groupby
中,您希望在任何给定日期使用userid
的哪个值?大概不止一个,这是一个很好的观点。我想我对这个概念的理解是错误的。这和我想象的非常接近(顺便说一句,我以前从来没有看到过超过或者按关键字划分,这是为了让我对它们有所了解。如果我在选择之后添加不同的,我基本上得到了我所希望的-每个驾驶员一行,一天的最低/最高速度。我可以用progra获得剩下的部分。)从这里开始使用mming语言。谢谢!请注意,虽然这在MsSql Studio中非常有效,但它在PlayFramework 2.2.2
和Ebean
中不起作用。查询没有错误,这是一件好事,但由于Ebean中的一个错误,该错误在3.3.1-RC2
时已修复,当然,这是不兼容的与播放2.2.2。