SQL:差距和孤岛问题 - 日期不连续导致排名不准确
SQL: Gaps and Island Problem - Date not consecutive causing rank inaccurate
这是我问的 的跟进。
Quarter Segment Customer *Counter*
Q1 2018 A A1 1
Q2 2018 A A1 2
Q3 2018 A A1 3
Q4 2018 B A1 1
Q1 2019 B A1 2
Q2 2019 A A1 1
Q1 2020 A A1 *1* I want 1 not 2 here because it's not consecutive (we don't have Q3 & Q4 2019)
Q2 2020 A A1 *2* I want 2 not 3 here because it reset in Q1 2020.
如果日期是连续的,则以下查询有效。我将如何调整查询以获得我正在寻找的内容?我尝试添加一个滞后 1 行的新列,并尝试检查新列中的季度值是否基本上是前 1 个季度的真实值(如果是,则使用计数器,如果不是,则使用“1”重新启动)。但它不会重置以下记录。那我就不知道怎么办了。
select quarter, customer, segment,
row_number() over (partition by customer, segment, seqnum - seqnum_cs order by right(quarter, 4), left(quarter, 2)) as counter
from (select t.*,
row_number() over (partition by customer order by right(quarter, 4), left(quarter, 2)) as seqnum,
row_number() over (partition by customer, segment order by right(quarter, 4), left(quarter, 2)) as seqnum_cs
from t
) t
order by customer, seqnum;
您需要修复数据模型!无论如何,这都是通过枚举宿舍来解决的。
select quarter, customer, segment,
row_number() over (partition by customer, segment, q_seqnum - seqnum_cs order by q_seqnum) as counter
from (select t.*,
row_number() over (partition by customer, segment order by q_seqnum) as seqnum_cs
from (select t.*,
cast(right(quarter, 4) as int) * 4 + cast(substring(quarter, 2, 1) as int) as q_seqnum
from t
) t
) t
order by customer, q_seqnum;
这是我问的
Quarter Segment Customer *Counter*
Q1 2018 A A1 1
Q2 2018 A A1 2
Q3 2018 A A1 3
Q4 2018 B A1 1
Q1 2019 B A1 2
Q2 2019 A A1 1
Q1 2020 A A1 *1* I want 1 not 2 here because it's not consecutive (we don't have Q3 & Q4 2019)
Q2 2020 A A1 *2* I want 2 not 3 here because it reset in Q1 2020.
如果日期是连续的,则以下查询有效。我将如何调整查询以获得我正在寻找的内容?我尝试添加一个滞后 1 行的新列,并尝试检查新列中的季度值是否基本上是前 1 个季度的真实值(如果是,则使用计数器,如果不是,则使用“1”重新启动)。但它不会重置以下记录。那我就不知道怎么办了。
select quarter, customer, segment,
row_number() over (partition by customer, segment, seqnum - seqnum_cs order by right(quarter, 4), left(quarter, 2)) as counter
from (select t.*,
row_number() over (partition by customer order by right(quarter, 4), left(quarter, 2)) as seqnum,
row_number() over (partition by customer, segment order by right(quarter, 4), left(quarter, 2)) as seqnum_cs
from t
) t
order by customer, seqnum;
您需要修复数据模型!无论如何,这都是通过枚举宿舍来解决的。
select quarter, customer, segment,
row_number() over (partition by customer, segment, q_seqnum - seqnum_cs order by q_seqnum) as counter
from (select t.*,
row_number() over (partition by customer, segment order by q_seqnum) as seqnum_cs
from (select t.*,
cast(right(quarter, 4) as int) * 4 + cast(substring(quarter, 2, 1) as int) as q_seqnum
from t
) t
) t
order by customer, q_seqnum;