SQL:如果数据显示时间超过 window,则值为 Return

SQL: Return values if data shows up over window of time

我有一个每天运行的脚本来检查不同卖家的订单状态。输出填充一个看起来像这样的 table,它告诉我订单的失败状态:

| date       | failure                 | order | seller_id |
|------------|-------------------------|-------|-----------|
| 2021-04-01 | stuck_in_pending_status | 123   | user1     |
| 2021-04-01 | shipping_is_late        | 456   | user2     |
| 2021-04-01 | stuck_in_pending_status | 789   | user3     |
| 2021-04-02 | stuck_in_pending_status | 123   | user1     |
| 2021-04-02 | shipping_is_late        | 456   | user2     |
| 2021-04-03 | stuck_in_pending_status | 123   | user1     |
| 2021-04-04 | stuck_in_pending_status | 987   | user1     |
| 2021-04-04 | shipping_is_late        | 654   | user3     |

我可以通过此查询获得有关系统整体运行状况的摘要统计信息,以查看订单如何失败以及订单是否堆积 up/there 是任何特定日期的失败高峰 :

SELECT
    date,
    failure,
    COUNT(0)
FROM my table
WHERE
    date >= '2021-03-01'
GROUP BY
    date,
    failure

我还可以将 seller_id = foo 添加到 WHERE 子句中以获得卖家特定的故障

我想更详细地查看卖家级别订单的具体运行状况,特别是同一订单在一段时间内(比如 3 天)是否出现问题。因此,如果同一订单在 3 天内出现故障,请给我卖家,以便我可以通知某人调查发生这种情况的原因。

例如,对于上面的 table,我想查询 return user1,因为订单 123 已经连续 3 天出现问题。 构建这样的查询的最佳方式是什么?我会使用 WINDOW 函数吗?

如果我没理解错的话,你可以使用window函数:

select * from (
SELECT * , 
    row_number() over (partition by order, seller_id order by date desc) rn
FROM mytable
WHERE date >= '2021-03-01'
) t 
where rn = 1

只需使用lag()。要按顺序获取所有“第三”行,您可以使用:

select t.*
from (select t.*, 
             lag(date, 2) over (partition by order_id order by date) as date_2
      from mytable t
     ) t
where date_2 = date - interval '2 day';

注意:data/time函数特定于数据库。这使用标准语法;您可能需要调整您的数据库。