【问题标题】:Identify Start and End Dates from Consecutive Dates从连续日期中识别开始日期和结束日期
【发布时间】:2019-05-16 04:30:51
【问题描述】:

我正在尝试创建一个连续日期已售出 >=200 个单位的输出。我使用前导函数获取下一个开始日期,但无法获得 05/04 开始日期的 05/06 结束日期。我们需要某种循环吗?

CREATE TABLE tbl_sls
(date1 date, Sales int);

INSERT INTO sales
(date1, Sales)
VALUES
('2019-05-01', 200),
('2019-05-02', 200),
('2019-05-03', 100),
('2019-05-04', 200),
('2019-05-05', 200),
('2019-05-06', 200),
('2019-05-10', 200),
('2019-05-11', 200),
('2019-05-12', 100);

我已经编写了下面的代码,但无法达到任何程度。

select date1, sales, rank() over(partition by sales order by date1)
from (
  select a.date1, b.sales from
  (select date1 from sales
  where date1<'2019-05-07') a
  left join
  (select date1, sales from sales
   where sales>=200) b
   on a.date1=b.date1
  ) x

预期输出:

date_start|date_end
'2019-05-01'|'2019-05-02'
'2019-05-04'|'2019-05-06'
'2019-05-10'|'2019-05-11'

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql


【解决方案1】:

这是一个空缺问题。这是一个使用 SQL Server 语法的解决方案:

select min(date1), max(date1), sales
from (select s.*, row_number() over (partition by sales order by date1) as seqnum
      from sales s
     ) s
group by dateadd(day, - seqnum, date1), sales;

Here 是一个 dbfiddle。这给出了相同销售编号的相邻值。

这是对您的具体问题的更好回答:

select min(date1), max(date1)
from (select s.*, row_number() over (order by date1) as seqnum
      from sales s
      where sales >= 200
     ) s
group by dateadd(day, - seqnum, date1)
order by 1

And the db<>fiddle.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多