簡體   English   中英

選擇日期范圍而不重疊

[英]Selecting ranges of dates without overlapping

我有以下關系模式:

dates(date: date, code: char)

代碼可以是ST,MN,MX,ED。 一個例子:

╔════════════╦══════╗
║    date    ║ code ║
╠════════════╬══════╣
║ 2001-10-01 ║ ST   ║
║ 2001-10-20 ║ ST   ║
║ 2001-11-01 ║ MX   ║
║ 2001-11-01 ║ MN   ║
║ 2001-11-14 ║ MX   ║
║ 2001-11-15 ║ ED   ║
║ 2001-11-15 ║ MX   ║
║ 2001-11-27 ║ MN   ║
║ 2001-12-01 ║ ST   ║
║ 2001-12-01 ║ ED   ║
║ 2001-12-02 ║ MX   ║
║ 2001-12-03 ║ MX   ║
║ 2001-12-05 ║ ED   ║
║ 2001-12-20 ║ ST   ║
║ 2001-12-21 ║ MN   ║
║ 2001-12-24 ║ MX   ║
║ 2001-12-31 ║ ED   ║
╚════════════╩══════╝

我需要:

  1. 找出任何日期范圍,日期范圍從以ST為代碼的日期開始,以以ED為代碼的日期結束。
  2. 在這些范圍內,不能有任何以ST或ED作為代碼的元組(范圍不能重疊)。
  3. 無需任何步驟,只需一個SELECT語句即可完成此操作(我可以使用WITH)。

我通過以下查詢完成了第一部分:

SELECT DISTINCT ON (dt.date) dt.date AS start, dt1.date AS end
FROM dates AS dt, dates AS dt1
WHERE dt.type='ST' AND dt1.type='ED' AND dt.date<dt1.date;

我不知道如何消除重疊范圍。 使用給定的示例數據,我的查詢輸出:

╔════════════╦════════════╗
║   start    ║    end     ║
╠════════════╬════════════╣
║ 2001-10-01 ║ 2001-12-01 ║
║ 2001-10-20 ║ 2001-11-15 ║
║ 2001-12-01 ║ 2001-12-31 ║
║ 2001-12-20 ║ 2001-12-31 ║
╚════════════╩════════════╝

如您所見,第二個范圍與第一個范圍重疊,因此它無法正常工作。

正確的輸出應為:

╔════════════╦════════════╗
║   start    ║    end     ║
╠════════════╬════════════╣
║ 2001-10-20 ║ 2001-11-15 ║
║ 2001-12-20 ║ 2001-12-31 ║
╚════════════╩════════════╝

如果我理解正確的話,那么你可以使用lead()where為了這個目的:

select date as startdate, next_date as enddate
from (select d.*,
             lead(code) over (order by date) as next_code,
             lead(date) over (order by date) as next_date
      from dates d
      where code in ('ST', 'ED')
     ) d
where code = 'ST' and
      next_code = 'ED';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM