在Postgresql中查找第二周

wlzqhblo  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(198)

我的数据包括:
| 客户ID|事务处理日期(_D)|周_ISO|
| - -|- -|- -|
| 第001号|2022年9月1日|三十五个|
| 第001号|2022年9月4日|三十五个|
| 第001号|二十二年九月十四日|三十七人|
| 二号|2022年9月3日|三十五个|
| 二号|2022年9月1日|三十五个|
| 二号|二十二年九月十八日|三十七人|
| 二号|二十二年九月二十日|三十八|
| C 003号|2022年9月2日|三十五个|
| C 003号|二十二年九月二十八日|三十九|
| C 004色|2022年9月8日|三十六人|
| C 004色|二十二年九月十八日|三十七人|
前面有我的代码:

create or replace view the_view as
select customerid, trans_date, 
       extract('week' from trans_date) week_iso
from the_table;

接下来,我想知道CustomerID将在哪一周返回?它将如下所示:
| 客户ID|周_ISO|第一个|第二个|
| - -|- -|- -|- -|
| 第001号|三十五个|三十五个|三十七人|
| 第001号|三十五个|三十五个|三十七人|
| 第001号|三十七人|三十五个|三十七人|
| 二号|三十五个|三十五个|三十七人|
| 二号|三十五个|三十五个|三十七人|
| 二号|三十七人|三十五个|三十七人|
| 二号|三十八|三十五个|三十七人|
| C 003号|三十五个|三十五个|三十九|
| C 003号|三十九|三十五个|三十九|
| C 004色|三十六人|三十六人|三十七人|
| C 004色|三十七人|三十六人|三十七人|
最后,为了使CustomerID上没有重复项,最终显示应该是这样的。
| 客户ID|第一个|第二个|
| - -|- -|- -|
| 第001号|三十五个|三十七人|
| 二号|三十五个|三十七人|
| C 003号|三十五个|三十九|
((C 004不包括,因为我需要谁客户ID谁在他们的第一周先来))

bnlyeluc

bnlyeluc1#

我了解到,对于每个客户,您需要一行来显示他们的前两个 * 唯一 * 周。这可以通过denste_rank()来完成,以便对唯一周进行排名,然后使用条件聚合进行透视:

select customerid,
    max(trans_week) where (rn = 1) trans_week_1,
    max(trans_week) where (rn = 2) trans_week_2
from (
    select cusomerid, 
        date_trunc('week', trans_date) trans_week,
        dense_rank() over(partition by customerid order by date_trunc('week', trans_date)) rn
    from the_table t
) t
group by customerid

请注意,我更改了逻辑,将日期 * 截断 * 为周,而不是将其转换为ANSI周数;我会假设您的数据可能跨越多个年份,并且您可能不希望同一周被分组到不同年份。

相关问题