【问题标题】:Count of Value from the Given Date time + 1Hour给定日期时间 + 1 小时的值计数
【发布时间】:2020-12-06 13:22:51
【问题描述】:

我有一个像这样的数据集:

Date - Time Dimension1  Dimension2  Count
10-1-2020 00:18:15  A   B   2
10-1-2020 01:18:00  A   B   3
10-1-2020 01:45:00  A   B   2
10-1-2020 01:48:00  A   B   1
10-1-2020 03:02:00  B   A   5

我们在 Dataset 中看到的 DateTime 列有 2 个维度,最终显示的是相对于 Date Time + 1Hour 的值的计数。

Record 1 : Given Date : 01/10/2020 12:18:15 AM  Date + 1Hour : 01/10/2020 01:18:15 AM 

因此,在这两个日期之间,我需要找出匹配记录的数量。对于此日期范围,有 2 条记录在 1 小时内,因此计数为 2。

代码:

SELECT
D5,
CAL_DATE,
Transaction_DATETIME,
D1,
D2,
D3,
D4,
COUNT(D4) AS CNT
FROM TAB1
WHERE 
timestamp(Transaction_DATETIME, 'MM-D-YYYY HH:mm:ss TT') >= timestamp(Transaction_DATETIME, 'MM-D-YYYY HH:mm:ss TT')
AND timestamp(Transaction_DATETIME, 'MM-D-YYYY HH:mm:ss TT') <= Timestamp(Transaction_DATETIME + Time#('01:00:00','HH:mm:ss'),'MM-D-YYYY HH:mm:ss TT')
GROUP By
D5,
DATE,
Transaction_DATETIME,
D1,
D2,
D3,
D4;

请求您的帮助。

谢谢。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。您的代码不是很有效的 SQL。而且你的问题很不清楚。你想计算什么?
  • 我正在计算在时间戳和时间戳 + 1 小时之间发生的事务计数,并且应该为所有时间戳计算该场景。

标签: sql timestamp


【解决方案1】:

SQL 为此目的支持窗口函数。在许多数据库中,语法是这样的:

select t.*,
       count(*) over (partition by dim1, dim2
                      order by datetime
                      range between current row and interval '1 hour' following
                     ) as cnt
from t;

并非所有数据库都支持区间范围的窗口函数。其中,需要一个子查询:

select t.*,
       (select count(*)
        from t t2
        where t2.dim1 = t.dim1 and t2.dim2 = t.dim2 and
              t2.datetime >= t.datetime and
              t2.datetime < t.datetime + interval '1 hour'
       ) as cnt
from t;

再次注意,众所周知,日期/时间函数因数据库而异。以上是标准 SQL,但可能需要针对您的数据库进行调整。

【讨论】:

  • 嗨,戈登,对于上面的相同查询,我想将已经考虑的数据时间的计数显示为 0。例如,第二条记录已经在第一条记录的区间内,所以我不想计算第二条记录的值,因为它已经被考虑过了。请帮忙。
  • @Ishan 。 . .我建议您提出一个新的问题,并提供适当的样本数据、期望的结果和解释。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2017-12-27
  • 1970-01-01
  • 2021-10-09
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多