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函数特定于数据库。这使用标准语法;您可能需要调整您的数据库。
我有一个每天运行的脚本来检查不同卖家的订单状态。输出填充一个看起来像这样的 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函数特定于数据库。这使用标准语法;您可能需要调整您的数据库。