查找过去 30 天内之前的门票数量

问题描述 投票:0回答:1

我正在尝试在 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 正在查看的内容)。

有没有办法按日期而不是行数限制有序分析函数? 我应该用什么来代替?

sql teradata
1个回答
0
投票

我建议您使用“横向连接”而不是使用 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 子句中使用的函数会剥夺优化器对索引的访问权限,从而可能使查询速度比实际需要的速度慢。)

© www.soinside.com 2019 - 2024. All rights reserved.