【问题标题】:SQL select MAX data within each 12 hoursSQL 选择每 12 小时内的 MAX 个数据
【发布时间】:2016-08-04 20:16:29
【问题描述】:

我有一个名为 temp 的表。在此表中,我有日期和值。

Date               | Value
2016/04/01 07:00am |   1
2016/04/01 09:00am |   2
2016/04/01 11:00am |   3
...
2016/04/01 07:00pm |   5
2016/04/01 11:00pm |   2
...
2016/04/02 07:00am |   10
2016/04/02 09:00am |   13
2016/04/02 11:00am |   1
...
2016/04/02 07:00pm |   32
2016/04/02 09:00pm |   40

我想退货:

Date               | Value
04/01/2016 11:00am | 3
04/01/2016 07:00pm | 5
04/02/2016 09:00am | 13
04/02/2016 09:00pm | 40

这个想法是以 12 小时为间隔进行分组,然后找到该组的最大值。

到目前为止,我有:

SELECT t.date, max(t.value) 
FROM temp t
WHERE t.Date between DATEADD(hour, 7, '04/01/2016') and DATEADD(minute, 1859, '04/02/2016')
GROUP BY DATEPART(Hour, t.date)%12, t.date
ORDER BY Date

但它返回所有数据,没有 12 小时组。

有什么想法吗?

【问题讨论】:

  • 你们的 12 小时小组每天都一样吗 - 午夜到中午和 12:01 - 11:59 pm?
  • 是的,每天都一样。
  • 如果您的日期实际上包含上午/下午,您还可以按日期的最后两个字符对其进行分组

标签: sql sql-server


【解决方案1】:

您不想要MAX,因为您不想按日期分组,您想要具有最大值的日期时间的单个实例。因此,您可以根据日期和上午/下午时段将ROW_NUMBERPARTITION 一起使用,以获取该时段内具有最大值的行(ORDER BY t.value DESC):

SELECT date, value
FROM
(SELECT t.date, 
    t.value,
    ROW_NUMBER() 
        OVER(PARTITION BY CAST(t.date AS date), CASE WHEN DATEPART(hour, t.date) < 12 THEN 0 ELSE 1 END 
        ORDER BY t.value DESC) AS rownum
    FROM temp t
    WHERE t.Date between DATEADD(hour, 7, '04/01/2016') and DATEADD(minute, 1859, '04/02/2016')
) max_val
WHERE max_val.rownum = 1
ORDER BY Date

【讨论】:

  • 这又返回了我所有的数据,没有组。
  • 抱歉忘记CASTdate 中的PARTITION(假设是最新版本的SQL?)...
  • 等等,我需要组在 04/01 上午 7:00 - 04/01 7:00 之间,然后是 04/01 7:00 pm - 04/02 07:00am。
  • 所以将 DATEPART(hour, t.date)
  • 不,实际上你需要DATEPART(hour, DATEADD(hour, -7, t.date)) &lt; 12
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2011-12-21
相关资源
最近更新 更多