我正在尝试在 2024 年所有门票的查询中添加“过去 30 天内的门票数量”列。到目前为止我得到的是:
SELECT customer_id,
ticket_number,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY receive_dt DESC
) AS "Num Tickets Last 30 Days"
FROM tickets
WHERE EXTRACT(YEAR FROM receive_dt) = 2024
上面的方法效果很好,除了它给了我今年所有门票的计数(当然,这就是我的 WHERE 正在查看的内容)。
有没有办法按日期而不是行数限制有序分析函数? 我应该用什么来代替?
我建议您使用“横向连接”而不是使用 ab 分析函数。在 Teradata 中,我相信其语法是
cross apply
或 outer apply
以及“outer apply”,允许返回不匹配的行(类似于左连接)。我在这里使用了这个,因为可能有一些行在过去 30 天内有零票。这里,计数是在 outer apply
内执行的,并且该结果被视为主查询的一列:
SELECT
t.customer_id
, t.ticket_number
, tickets_last_30_days.Num_Tickets_Last_30_Days
FROM tickets t
OUTER APPLY (
SELECT COUNT(*) AS Num_Tickets_Last_30_Days
FROM tickets sub
WHERE sub.customer_id = t.customer_id
AND sub.receive_dt >= t.receive_dt - INTERVAL '30' DAY
AND sub.receive_dt < t.receive_dt
) AS tickets_last_30_days
WHERE t.receive_dt >= DATE '2024-01-01'
AND t.receive_dt < DATE '2025-01-01'
ORDER BY
t.customer_id
, t.receive_dt DESC
另请注意,我建议在 where 子句中使用日期范围,而不是在每行上使用函数
extract
。 (通常在 where 子句中使用的函数会剥夺优化器对索引的访问权限,从而可能使查询速度比实际需要的速度慢。)