【问题标题】:Select additional fields when using GROUP BY使用 GROUP BY 时选择其他字段
【发布时间】:2014-03-11 21:43:03
【问题描述】:

我使用的是 MSSQL 2008 R2,遇到以下情况:

通过以下查询,我将获得我期望的数据(每个日期的 maxmin 速度)。 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 中选择一些其他字段(例如用户 ID、用户名等)。如果我修改查询以包含其他字段,如下所示:

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 添加到GROUP BY 子句中,我的数据当然会发生变化,现在每个日期将包含多个条目。

所以,我的问题是如何选择其他字段,同时仍保留我想要的原始数据(每个唯一日期的 minmax)?

【问题讨论】:

  • 在任何给定日期您想要userid 的哪个值?大概不止一个。
  • 这是一个很好的观点。我想我一直在错误地概念化这一点。

标签: sql sql-server jpa ebean


【解决方案1】:

如果您想从Driver 中选择行以及speedmax()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;

编辑:

如果您希望每位司机每天一排,请使用简单的group by

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;

如果要添加其他列,则需要将它们同时添加到 selectgroup by

【讨论】:

  • 这非常接近我的想象(顺便说一句,我以前从未见过 OVERPARTITION BY 关键字,所以这是为了让我睁大眼睛。如果我添加 @ 987654332@ 在SELECT 之后,我基本上得到了我所希望的 - 每个司机一行,他们一天的最低/最高速度。我可以从这里用编程语言完成剩下的路。谢谢!
  • 请注意,虽然这在 MsSql Studio 中工作得很好,但在 PlayFramework 2.2.2Ebean 中不起作用......查询没有错,这是一件美丽的事情,但是由于自 3.3.1-RC2 起已修复的 Ebean 中的错误,这当然与 Play 2.2.2 不兼容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2019-05-11
  • 2014-07-26
  • 2021-10-30
  • 2022-10-23
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多