SQL Casting datetime 并将其用于 groupby
Posted
技术标签:
【中文标题】SQL Casting datetime 并将其用于 groupby【英文标题】:SQL Casting datetime and using it for groupby 【发布时间】:2018-08-22 04:05:56 【问题描述】:试图找出我组织中每个 ID 的小时差。这是我当前的查询:
SELECT Label, SUM(Diff)
FROM (
select distinct mr.deviceid, TO_CHAR(mr.readdate, 'MM/dd/yyyy HH:00 am') as Label, (MAX(ComputedReading) - MIN(ComputedReading)) AS Diff
from analytic.twmeterreading as mr
WHERE mr.ReadDate >= DATEADD(hour, -100, GetDate()) AND mr.ReadDate <= GetDate() and mr.orgunitid = 1
group by mr.deviceid, Label
order by label
) as ReadData
GROUP BY deviceid, Label
ORDER BY Label
数据类型有:
读取日期:日期时间
设备ID:整数
readdate 将以这种格式返回:
2018-08-17 07:01:16
2018-08-17 08:00:18
2018-08-17 14:59:41
2018-08-17 12:34:17
2018-08-17 06:02:06
2018-08-17 01:58:54
2018-08-17 12:02:14
2018-08-17 15:01:22
2018-08-17 11:03:16
2018-08-17 05:59:05
2018-08-17 14:02:29
2018-08-17 07:01:09
2018-08-17 09:58:17
2018-08-17 11:56:42
2018-08-17 02:01:13
2018-08-17 15:03:28
2018-08-17 06:03:45
2018-08-17 17:01:22
当我从查询中排除 :00 am 时,我会返回结果。我无法弄清楚为什么将这些作为查询结果的一部分添加为全 0。
示例: 对于这种类型:TO_CHAR(mr.readdate, 'MM/dd/yyyy') as Label
结果是这样的:
label sum
08/18/2018 108
08/18/2018 3
08/18/2018 254
08/18/2018 50
08/18/2018 229
08/18/2018 983
08/18/2018 434
08/18/2018 64
08/18/2018 2
08/18/2018 0
08/18/2018 370
当我这样做时:TO_CHAR(mr.readdate, 'MM/dd/yyyy hh:00 AM') as Label 我把总和全部归为 0
有什么想法吗?顺便说一句,如果重要的话,这是在红移上
【问题讨论】:
为什么'MM/dd/yyyy HH:00 am'
。为什么不'MM/dd/yyyy HH:MI am'
?
我试图不包括会议记录。只是纯粹的日期和时间
那么,'MM/dd/yyyy HH am'
?
总和仍然为零。不太清楚为什么在最后添加 am 时总和不会发生
为什么在子选择中包含deviceid
,如果最后不使用GROUP BY
?为什么ORDER BY
在子选择中?另外,不要使用DISTINCT
和GROUP BY
。
【参考方案1】:
我不清楚你到底想要什么,但这里有一个似乎可行的例子:
SELECT deviceid, Label, SUM(Diff)
FROM (
SELECT
mr.deviceid,
mr.readdate::date as Label,
(MAX(ComputedReading) - MIN(ComputedReading)) as Diff
FROM twmeterreading as mr
WHERE mr.ReadDate::date >= current_date
AND mr.ReadDate::date <= current_date
AND mr.orgunitid = 1
GROUP BY mr.deviceid, Label
) as ReadData
GROUP BY deviceid, Label
ORDER BY Label
实时代码:http://sqlfiddle.com/#!15/8f3c0/2
我使用了 postgresql,因为它似乎最接近 redshift。请注意,日期转换函数有点不同。
请评论它与您要求的答案有多接近,我会进行调整。
【讨论】:
您好,感谢您的回复。它相当接近。我感兴趣的是试图在过去的 24 小时内以小时为单位获得它。当我将上面的逻辑修改为 to_char(date, 'hh am') 时,它会全部返回 12。不太清楚为什么。会认为是凌晨 1 点、下午 5 点等 抱歉,我应该更正一下。它确实以正确的时间返回,它是 diff 列,总是以 0 的形式出现 做更多的挖掘,所以实际上每个小时都有一个记录,这就是它返回为 0 的原因。如果存在,有没有一种简单的方法可以与前几个小时的记录进行比较?以上是关于SQL Casting datetime 并将其用于 groupby的主要内容,如果未能解决你的问题,请参考以下文章