【问题标题】:Count distinct per month/year but display all dates in the query result每月/每年计算不同但在查询结果中显示所有日期
【发布时间】:2020-11-20 05:18:12
【问题描述】:

DB-Fiddle

CREATE TABLE sales (
    id int auto_increment primary key,
    orderID VARCHAR(255),
    sent_date DATE
);

INSERT INTO sales
(orderID, sent_date
)
VALUES 
("Order_01", "2019-03-15"),
("Order_01", "2019-03-16"),
("Order_02", "2020-06-16"),
("Order_03", "2020-07-27"),
("Order_03", "2020-08-05"),
("Order_03", "2020-08-10");

预期结果:

sent_date      COUNT(distinct orderID)
2019-03-15              1
2019-03-16              0
2020-06-16              1
2020-07-27              1
2020-08-05              1
2020-08-10              0

在上表中,我有相同的orders 和多个sent_dates

现在,我想按每日统计每个month/year唯一 orderIDs
因此,我正在寻找一个查询来检查每个 orderID 是否已经存在于以前的 sent_date 中,如果存在,则当前 sent_date 的值应该是 0

我知道每月/每年唯一计数的最简单方法是这个查询:

SELECT
YEAR(sent_date),
MONTH(sent_date),
COUNT(distinct orderID)
FROM sales
GROUP BY 1,2;

但是,我需要将每个 sent_date 分别显示在一个列表中,正如您在预期结果中看到的那样。
尽管我需要每天查询数据,但我需要什么查询才能获得count unique

【问题讨论】:

    标签: mysql sql date count window-functions


    【解决方案1】:

    如果我理解正确,您想标记每个订单在一个月内的第一次出现。您可以使用窗口函数:

    select s.*,
           ( row_number() over (partition by extract(year_month from sent_date), orderid order by sent_date) = 1 ) as flag
    from s;
    

    MySQL 8+ 支持窗口函数。

    【讨论】:

      【解决方案2】:

      我认为您想要每个日期每个 orderid 的第一个每月出现的直方图。

      这是一种使用窗口函数的方法,在 MySQL 8.0 中可用:

      select sent_date, sum(rn = 1) cnt_distinct_orderid
      from (
          select s.*, row_number() over(partition by year(sent_date), month(sent_date), orderid order by sent_date) rn
          from sales s
      ) t
      group by sent_date
      order by sent_date
      

      在早期版本中,一个选项使用自联接:

      select d.sent_date, count(s.orderid) cnt_distinct_orderid
      from (select distinct sent_date from sales) d
      left join (
          select orderid, min(sent_date) min_sent_date
          from sales 
          group by orderid, date_format(sent_date, '%Y-%m-01')
      ) s on d.sent_date = s.min_sent_date
      group by d.sent_date
      

      Demon on DB Fiddle

      发送日期 | cnt_distinct_orderid :--------- | ------------------: 2019-03-15 | 1 2019-03-16 | 0 2020-06-16 | 1 2020-07-27 | 1 2020-08-05 | 1 2020-08-10 | 0

      【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多