【问题标题】:Count distinct per fiscal year and display all dates in query result每个会计年度计数不同并在查询结果中显示所有日期
【发布时间】:2020-12-10 18:12:56
【问题描述】:

DB-Fiddle:

CREATE TABLE customers (
    id int auto_increment primary key,
    order_date DATE,
    customerID VARCHAR(255)
);

INSERT INTO customers
(order_date, customerID
)
VALUES 
("2020-01-15", "Customer_01"),
("2020-02-15", "Customer_01"),
("2020-03-18", "Customer_01"),
("2020-04-22", "Customer_01"),
("2021-01-19", "Customer_01"),

("2020-01-25", "Customer_02"),
("2020-02-26", "Customer_02"),
("2020-11-23", "Customer_02"),
("2021-01-17", "Customer_02"),
("2021-02-20", "Customer_02");

预期结果:

order_date   |      quantity
             |    (fiscal year)
-----------------------------------------------------------------
2020-01-15   |           1         --> Customer_01 appears the first time between 2019-03 and 2020-02)
2020-01-25   |           1         --> Customer_02 appears the first time between 2019-03 and 2020-02)
2020-02-15   |           0
2020-02-26   |           0
2020-03-18   |           1         --> Customer_01 appears the first time between 2020-03 and 2021-02
2020-04-22   |           0
2020-11-23   |           1         --> Customer_02 appears the first time between 2020-03 and 2021-02
2021-01-17   |           0
2021-01-19   |           0
2021-02-20   |           0

在上面的结果中,我想列出所有order dates计算每个财政年度customers 不同的数量。
fiscal year 在日历年之后两个月开始,因此从 March 变为 February
(例如,从 2020-032021-02)。

例如,Customer_012020-03 财政年度内首次出现在2020-03-18 上,直到2021-02
因此,这个order_date 被分配给它1
如果客户在会计年度内再次出现,下一个order_date 将被分配给它0


到目前为止,我已经使用了这个查询:

SELECT
order_date,
SUM(rn = 1) AS quantity
FROM 
  (SELECT 
  order_date, 
  row_number() over(PARTITION BY YEAR(order_date), customerID ORDER BY order_date) rn
  FROM customers
  ) t
GROUP BY 1;

它非常适合日历年。
但是,我不知道如何应用从财政年度到财政年度的两个月转变。
你有什么想法吗?

【问题讨论】:

  • PARTITION BY YEAR(order_date - INTERVAL 2 MONTH)?

标签: mysql sql date count window-functions


【解决方案1】:

我已将您的查询更新如下:

SELECT
order_date,
SUM(rn = 1) AS quantity
FROM 

  (SELECT 
  order_date, 
  row_number() over(PARTITION BY YEAR(order_date - INTERVAL 2 MONTH), customerID ORDER BY order_date) rn
  FROM customers
  ) t
  
GROUP BY 1;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-11-20
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多