【问题标题】:SQL - multiple date time aggregations within single querySQL - 单个查询中的多个日期时间聚合
【发布时间】:2018-06-28 02:09:33
【问题描述】:

我有一个客户操作的 SQL 数据库,客户由 UniqueId 定义,操作被赋予操作时间戳的日期和时间。用户可以在任何一天执行多个操作,如下所示:

UniqueID | actionDate | actionTime |
   1       17-01-18     13:01
   1       17-01-18     13:15
   2       17-01-18     13:15
   1       18-01-18     12:56

理想情况下,我想在单个查询中了解数据库中的多个内容。

  1. 首先是每个 uniqueId 在给定时间段(天、周、月)内执行操作的次数,因此对于上面的示例,18 年 1 月 17 日 id1 的计数为 2 ,18-01-18 的计数为 1,并假设它们是该周仅有的两个动作,则该周 id 1 的计数为 3。

  2. 在有多个操作的日子(上例中为 17-01-18),我想了解一天中操作的分布,更重要的是了解在一个时间范围内发生的操作数量一个小时。在这种情况下,id 想了解 13:00 到 14:00 之间发生了 2 个操作,id 1 但其他 23 小时有 0 个操作。

最终目标是拥有一个回顾三个月的时间序列,并能够查看每个唯一 ID 的每月、每周以及重要的每日/每日内部操作计数。

所需的结果可能如下所示:

ID | M1W1D1H1|M1W1D1H2|->|M1W1D1H13|->|M1W1D2H12|
   1   0         0            2             1
   2   0         0            1             0

M=月,W=周,D=日,H=小时。 AC = ActionCount

所以上面显示在第 1 个月,第 1 周,第 1 天,第 1 小时,id1 没有任何操作。第一个动作是在 M1W1D1H13 上,当时他们有两个动作。接下来的行动是在 W1、M1 的 D2 上。然后可以汇总以获得相应的、每周、每天的每月操作。结果将是相当稀疏的许多 0 操作。

感谢任何帮助和指导。

【问题讨论】:

  • 编辑您的问题并提供所需的结果。正如所写,这个问题太宽泛了。
  • @a_horse_with_no_name - 我的错,它的 Teradata
  • 三个月的结果约为。结果集中 92*24 = 2208 小时 = 2208 列。除了 Teradata 仅支持 2048 列之外,这应该在表示层中完成。要获取每小时的基本计数,您可以使用 group by UniqueID, actionDate, extract(hour from actionTime)

标签: sql teradata data-manipulation


【解决方案1】:

如果我理解您的问题,您有一个带有标准化数据结构中日期和时间详细信息的 ID。但是,您希望对这些数据进行非规范化处理,以便每个 id 在您想要的条件下仅聚合一行。

为此,您可以使用简单的 group by 并将您的聚合嵌套到 case 语句中,使它们符合您想要的列范围。如果你不能硬编码你的时间片并且需要它是可能的动态的,但我需要更多关于你的要求的信息。您还可以将 case 语句嵌套到 case 语句中,并使用派生表来进一步启用更复杂的规则。

所以,用你的例子...

sel
  UniqueID 
, sum(
  case when actionDate between <someDate> and <someDate> then 1
  end) as evnt_cnt_in_range01
, count(distinct(
  case when actionDate between <someDate> and <someDate> then actionDate
  end)) as uniq_dates_in_range01
, min(
  case when actionDate between <someDate> and <someDate> then actionTime
  end) as earliest_action_in_range01
, max(
  case when actionDate between <someDate> and <someDate> then actionTime
  end) as latest_action_in_range01
, max(
  case when actionDate between <someDate> and <someDate> then
    CASE WHEN actionTime > '12:00' THEN 1 ELSE 0 END -- I flip caps to keeps nests straight
  end) as cnt_after_noon_action_range1
FROM <sometable>
group by 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2021-05-14
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多