我有一个用户级别的交易表,我想聚合它们,例如每个用户每个单独列的不同交易日期计数的总和。我使用子查询来做这个聚合,但没有得到正确的输出。
最小的桌子和我的尝试 :
CREATE TABLE trans (
user_id char(10),
purchase_date date,
prod1_amt int(10),
prod2_amt int(10),
prod3_amt int(10),
prod4_amt int(10),
prod5_amt int(10),
prod6_amt int(10)
);
INSERT INTO trans (user_id, purchase_date, prod1_amt, prod2_amt, prod3_amt, prod4_amt, prod5_amt, prod6_amt)
VALUES (A,1/14/2021,10,6,0,0,11,0)
,(A,6/14/2021,10,6,0,0,11,0)
,(B,1/14/2021,10,6,0,0,11,0)
,(B,11/14/2021,10,6,0,0,11,0)
,(C,6/14/2021,10,6,0,0,11,0)
, (B,1/10/2022,5,18,0,5,11,7)
,(A,1/19/2022,6,18,2,5,0,0)
,(A,1/19/2022,10,28,1,7,11,7)
,(B,1/19/2022,100,18,1,5,11,7)
,(C,1/20/2022,25,18,1,5,11,7)
,(C,1/20/2022,35,18,1,5,11,7)
,(B,4/19/2022,9,18,1,5,11,7)
,(A,5/23/2022,10,18,1,0,0,0)
,(A,7/23/2022,10,18,1,5,11,7)
,(B,7/23/2022,10,18,11,15,11,17)
,(C,8/23/2022,10,18,1,5,11,7);
我当前的查询:
CREATE OR REPLACE TABLE aggr_output_table(
WITH trns_base AS (
SELECT *,
EXTRACT(YEAR FROM purch_date) || '_' ||
CASE
WHEN EXTRACT(QUARTER FROM purch_date) IN (1, 2) THEN 'h1'
WHEN EXTRACT(QUARTER FROM purch_date) IN (3, 4) THEN 'h2'
END AS period_dt,
FROM (
SELECT *,
user_id,
count(distinct purchase_date) purch_dt
FROM trans
)
),
aggregation AS (
SELECT
user_id,
concat(period_dt || '_' ||, prod1_amt, prod2_amt, prod3_amt, prod4_amt, prod5_amt, prod6_amt) AS tx_period_metric,
COUNT(DISTINCT tx_date) cnt
FROM trns_base
GROUP BY 1, 2
)
select
base.*,
sum(base.cnt)
from trns_base base
)
但是这个查询并没有给出我预期的输出。谁能建议更好的解决方法来完成这项工作?
目标:
我只想获取每个用户每个单独列的交易日期的计数总和。我怎样才能修复我上面的 sql 尝试?谁能用更好的方法指出我?
期望的输出:
我想我要做的不是很复杂,只是连接相应的年份和列名我不清楚如何在 SQL 中完成。这是预期输出表的表模式:
CREATE TABLE aggr_trans (
user_id char(10),
2021_h1_trns_cnt_prod1_amt int(10),
2021_h2_trns_cnt_prod1_amt int(10),
2022_h1_trns_cnt_prod1_amt int(10),
2022_h2_trns_cnt_prod1_amt int(10),
2021_h1_trns_cnt_prod2_amt int(10),
2021_h2_trns_cnt_prod2_amt int(10),
2022_h1_trns_cnt_prod2_amt int(10),
2022_h2_trns_cnt_prod2_amt int(10),
2021_h1_trns_cnt_prod3_amt int(10),
2021_h2_trns_cnt_prod3_amt int(10),
2022_h1_trns_cnt_prod3_amt int(10),
2022_h2_trns_cnt_prod3_amt int(10),
2021_h1_trns_cnt_prod4_amt int(10),
2021_h2_trns_cnt_prod4_amt int(10),
2022_h1_trns_cnt_prod4_amt int(10),
2022_h2_trns_cnt_prod4_amt int(10),
2021_h1_trns_cnt_prod5_amt int(10),
2021_h2_trns_cnt_prod5_amt int(10),
2022_h1_trns_cnt_prod5_amt int(10),
2022_h2_trns_cnt_prod5_amt int(10),
2021_h1_trns_cnt_prod6_amt int(10),
2021_h2_trns_cnt_prod6_amt int(10),
2022_h1_trns_cnt_prod6_amt int(10),
2022_h2_trns_cnt_prod6_amt int(10)
);