在Oracle中动态时间戳记2天后每天计算计数

时间:2020-02-25 05:07:34

标签: sql oracle

假设我的Oracle数据库中有两个表...

一个表存储何时添加新集合

fig = sns.boxplot(data=[df2['DO_0'],df2['DO_2'],df2['DO_4'],df2['DO_6'],df2['DO_8'],df2['DO_10'],df2['DO_12'],df2['DO_14'],df2['DO_16'],df2['DO_18'],df2['DO_20'],df2['DO_22']],showmeans=True)
fig.set_xticklabels(['D/O_0','DO_2',...])

另一个表存储用户对集合执行的每个操作

+---------------+----------------------+
| collection_id |      created_ts      |
+---------------+----------------------+
|           001 | 02-JAN-2019 19:40:47 |
|           002 | 04-JAN-2019 00:05:05 |
+---------------+----------------------+

我的目标是确定创建集合后最多2天的每个集合的每日操作计数。

示例输出类似于

+---------------+---------------------------------+
| collection_id |            action_ts            |
+---------------+---------------------------------+
|           001 | 02-JAN-19 07.41.08.869000000 PM |
|           001 | 02-JAN-19 07.41.29.440000000 PM |
|           001 | 02-JAN-19 08.34.42.097000000 PM |
|           001 | 02-JAN-19 09.27.02.433000000 PM |
|           001 | 03-JAN-19 03.54.42.098000000 PM |
|           001 | 07-JAN-19 08.04.55.075000000 PM |
|           001 | 08-JAN-19 07.29.38.727000000 PM |
+---------------+---------------------------------+

是否可以使用计数和case语句的某种组合来获取此输出,还是必须将7个独立的查询进行某种组合才能处理可能在一周中创建集合的所有日子?

2 个答案:

答案 0 :(得分:2)

您可以利用PIVOT来获得所需的结果。

SELECT * FROM
( SELECT T1.COLLECTION_ID,
         TRUNC(T2.ACTION_TS) - TRUNC(T1.CREATED_TS) AS DIFF
    FROM TABLE1 T1
         JOIN TABLE2 T2 ON T1.COLLECTION_ID = T2.COLLECTION_ID
) PIVOT (
    COUNT ( 1 ) 
    FOR DIFF IN ( 0 AS ACTIONS_DAY_OF, 
                  1 AS ACTIONS_1_DAYS_AFTER, 
                  2 AS ACTIONS_2_DAYS_AFTER )
)

干杯!

答案 1 :(得分:0)

我只会使用条件聚合:

SELECT T1.COLLECTION_ID,
       (CASE WHEN TRUNC(T2.ACTION_TS) = TRUNC(T1.CREATED_TS) 
             THEN 1 ELSE 0
        END) as actions_day_of,
       (CASE WHEN TRUNC(T2.ACTION_TS) = TRUNC(T1.CREATED_TS) + INTERVAL '1' DAY 
             THEN 1 ELSE 0
        END) as actions_1_day_after,
       (CASE WHEN TRUNC(T2.ACTION_TS) = TRUNC(T1.CREATED_TS) + INTERVAL '2' DAY 
             THEN 1 ELSE 0
        END) as actions_2_day_after,
       (CASE WHEN TRUNC(T2.ACTION_TS) > TRUNC(T1.CREATED_TS) + INTERVAL '2' DAY 
             THEN 1 ELSE 0
        END) as actions_2plus_days_after
     TABLE2 T2
     ON T1.COLLECTION_ID = T2.COLLECTION_ID
GROUP BY T1.COLLECTION_ID;

注意最后一列。与PIVOT相比,拥有不平等要容易得多。