Teradata中同时间戳下切换开关事件的正确排序方案咨询
Teradata中处理同秒内ON/OFF事件的交替排序方案
针对同秒内出现的ON/OFF事件无法按交替顺序排序、无法直接用于有序分析函数的问题,可通过以下Teradata SQL逻辑实现正确排序:
核心思路
利用窗口函数先获取每个事件的上一个有效动作,再针对同秒内的事件,根据前一个动作的类型分配排序优先级,确保ON/OFF严格交替。
具体实现代码
WITH ranked_events AS ( -- 第一步:按时间戳+事件ID做初始排序,生成基础分组与前序动作 SELECT EVENT_ID, DATE_TIME, ACTION, LAG(ACTION) OVER(ORDER BY DATE_TIME, EVENT_ID) AS prev_action, DENSE_RANK() OVER(ORDER BY DATE_TIME) AS time_group FROM your_table_name ), sorted_same_second AS ( -- 第二步:处理同秒内事件的排序优先级 SELECT EVENT_ID, DATE_TIME, ACTION, prev_action, time_group, CASE WHEN ROW_NUMBER() OVER(PARTITION BY time_group ORDER BY EVENT_ID) = 1 THEN 1 WHEN prev_action = 'ON' AND ACTION = 'OFF' THEN 1 WHEN prev_action = 'OFF' AND ACTION = 'ON' THEN 1 ELSE 2 END AS sort_priority, ROW_NUMBER() OVER(PARTITION BY time_group ORDER BY EVENT_ID) AS group_row_num FROM ranked_events ) -- 第三步:生成最终排序键,用于后续有序分析 SELECT EVENT_ID, DATE_TIME, ACTION, ROW_NUMBER() OVER(ORDER BY time_group, sort_priority, group_row_num) AS final_sort_order FROM sorted_same_second ORDER BY final_sort_order;
代码说明
- ranked_events CTE:先按
DATE_TIME+EVENT_ID做初始排序,用LAG()获取前一个事件的动作,同时用DENSE_RANK()将同一秒的事件归为一组。 - sorted_same_second CTE:针对同秒组内的事件,判断当前动作与前序动作的交替性,优先排列符合交替规则的事件,连续同动作的事件后置。
- 最终查询:生成
final_sort_order作为有序分析函数的排序依据,确保整体序列符合ON/OFF交替逻辑。
示例数据执行结果
针对你提供的示例数据,执行后会得到如下排序:
| EVENT_ID | DATE_TIME | ACTION | final_sort_order |
|---|---|---|---|
| 1234 | 22/02/2023 12:05:00 | ON | 1 |
| 1235 | 22/02/2023 13:30:57 | OFF | 2 |
| 1237 | 22/02/2023 20:15:05 | ON | 3 |
| 1236 | 22/02/2023 20:15:05 | OFF | 4 |
内容的提问来源于stack exchange,提问作者markthornton90
相关产品推荐
相关产品推荐

