在 PostgreSQL 中检索最近连续日期的记录
Retrieve Records of the Last Consecutive Dates in PostgreSQL
编辑 抱歉第一个post 不清楚。如果该项目只出现 一次,它也应该包含。请检查 已更新 示例 table...
我有一份 table 每天每件商品的销售记录。 table 的候选键是 item_id 和日期的组合。我想要获得的是每个项目的最后(最新)连续日期的所有记录的视图。如果项目只出现一次,也应该包括在内。
我有什么
+---------+------------+------------+
| item_id | date | gross_sale |
| (text) | (date) | (double) |
+---------+------------+------------+
| 11aa | 2019-01-01 | 45 |
| 11aa | 2019-01-02 | 85 |
| 22bb | 2019-01-01 | 65 |
| 22bb | 2019-01-02 | 15 |
| 22bb | 2019-01-03 | 45 |
| 11aa | 2019-01-05 | 32 |
| 33cc | 2019-01-05 | 11 |
| 22bb | 2019-01-05 | 23 |
| 22bb | 2019-01-06 | 56 |
| 11aa | 2019-01-06 | 78 |
| 11aa | 2019-01-07 | 12 |
| 11aa | 2019-01-08 | 45 |
+---------+------------+------------+
我想要的
+---------+------------+------------+
| item_id | date | gross_sale |
+---------+------------+------------+
| 11aa | 2019-01-05 | 32 |
| 11aa | 2019-01-06 | 78 |
| 11aa | 2019-01-07 | 12 |
| 11aa | 2019-01-08 | 45 |
| 22bb | 2019-01-05 | 23 |
| 22bb | 2019-01-06 | 56 |
| 33cc | 2019-01-05 | 11 |
+---------+------------+------------+
我从几个 post 那里读到,它可以简单地使用 CTE 和 window 完成,但我对他们还是很陌生。如果您不介意,能否请您对代码的工作原理也做一个简短的解释?
干杯!
您可以枚举行并添加从数据结束开始的递增序列
select t.*
from (select t.*,
row_number() over (partition by item_id order by date desc) as seqnum,
max(date) over (partition by item_id) as max_date
from t
) t
where date + (seqnum - 1) * interval '1 day' = max_date
不需要cte,你可以使用这个简单的查询。
select distinct t1.item_id, t1.maxdate, t2.gross_sale from
(select item_id, max(date) as maxdate from table1 group by item_id) as t1
left join table1 t2 on t2.item_id= t1.maxdate and t1.item_id=t2.item_id
您可以通过相关子查询来检查特定日期的差异 item_id
SELECT ITEM_ID, DATE,
GROSS_SALE FROM TABLE X
Where Item_Id In (Select
Item_id from table t where
abs(t.Date-X.Date)=1)
Order
by Item_id asc, Date desc
编辑 抱歉第一个post 不清楚。如果该项目只出现 一次,它也应该包含。请检查 已更新 示例 table...
我有一份 table 每天每件商品的销售记录。 table 的候选键是 item_id 和日期的组合。我想要获得的是每个项目的最后(最新)连续日期的所有记录的视图。如果项目只出现一次,也应该包括在内。
我有什么
+---------+------------+------------+
| item_id | date | gross_sale |
| (text) | (date) | (double) |
+---------+------------+------------+
| 11aa | 2019-01-01 | 45 |
| 11aa | 2019-01-02 | 85 |
| 22bb | 2019-01-01 | 65 |
| 22bb | 2019-01-02 | 15 |
| 22bb | 2019-01-03 | 45 |
| 11aa | 2019-01-05 | 32 |
| 33cc | 2019-01-05 | 11 |
| 22bb | 2019-01-05 | 23 |
| 22bb | 2019-01-06 | 56 |
| 11aa | 2019-01-06 | 78 |
| 11aa | 2019-01-07 | 12 |
| 11aa | 2019-01-08 | 45 |
+---------+------------+------------+
我想要的
+---------+------------+------------+
| item_id | date | gross_sale |
+---------+------------+------------+
| 11aa | 2019-01-05 | 32 |
| 11aa | 2019-01-06 | 78 |
| 11aa | 2019-01-07 | 12 |
| 11aa | 2019-01-08 | 45 |
| 22bb | 2019-01-05 | 23 |
| 22bb | 2019-01-06 | 56 |
| 33cc | 2019-01-05 | 11 |
+---------+------------+------------+
我从几个 post 那里读到,它可以简单地使用 CTE 和 window 完成,但我对他们还是很陌生。如果您不介意,能否请您对代码的工作原理也做一个简短的解释?
干杯!
您可以枚举行并添加从数据结束开始的递增序列
select t.*
from (select t.*,
row_number() over (partition by item_id order by date desc) as seqnum,
max(date) over (partition by item_id) as max_date
from t
) t
where date + (seqnum - 1) * interval '1 day' = max_date
不需要cte,你可以使用这个简单的查询。
select distinct t1.item_id, t1.maxdate, t2.gross_sale from
(select item_id, max(date) as maxdate from table1 group by item_id) as t1
left join table1 t2 on t2.item_id= t1.maxdate and t1.item_id=t2.item_id
您可以通过相关子查询来检查特定日期的差异 item_id
SELECT ITEM_ID, DATE,
GROSS_SALE FROM TABLE X
Where Item_Id In (Select
Item_id from table t where
abs(t.Date-X.Date)=1)
Order
by Item_id asc, Date desc