Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用分组依据时选择其他字段_Sql_Sql Server_Jpa_Ebean - Fatal编程技术网

Sql 使用分组依据时选择其他字段

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

我使用的是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 '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。