SQL Server +检索数据而不重叠日期时间

问题描述 投票:0回答:2

我需要一些想法来最好地实现这个案例

我有数据,其中可以有多个值与开始和结束日期时间,现在我需要拉取数据而不重叠日期,下面是样本数据。

CREATE TABLE table2 (
  start_date DATE NOT NULL,
  end_date DATE NOT NULL,
  comments VARCHAR(100)  NULL ,
  id int
);

INSERT INTO table2 (start_date, end_date, id) VALUES
('2011-12-01', '2012-01-02', 5),
('2012-01-01', '2012-01-06', 5),
('2012-01-05', '2012-01-10', 5),
('2012-01-09', '2012-01-11', 5);

从这里我需要每个id不重叠的数据

('2011-12-01', '2012-01-02', 5),
('2012-01-05', '2012-01-10', 5)

请与我分享一下关于哪种手杖是实施此手段的最佳方式的想法?

感谢您的支持

谢谢,Manoj。

sql-server date distinct recursive-query overlapping
2个回答
2
投票

您提供的输出非常不清楚。在第一眼看到你正在寻找一个intervall,其中没有其他intervall开始(这将导致持续的intervall)。但你的第二个预期线与2012-01-10重叠?

如果其end_date不在另一行intervall中,则以下查询将返回一行...但这不会返回您的两个预期行,只是第一个。

SELECT * FROM table2 AS t
WHERE NOT EXISTS(SELECT 1 
                 FROM table2 AS x 
                 WHERE x.start_date<>t.start_date 
                   AND x.end_date BETWEEN t.start_date AND t.end_date
                );

我希望这能指出你正确的方向......


0
投票

以下将这样做:

WITH cte
AS
(   
    SELECT
        [start_date]
        , end_date
        , comments
        , id
    FROM
        (
            SELECT
                [start_date]
                , end_date
                , comments
                , id
                , ROW_NUMBER() OVER (PARTITION BY id ORDER BY [start_date]) R
            FROM table2
        ) Q
    WHERE R = 1

    UNION ALL

    SELECT
        [start_date]
        , end_date
        , comments
        , id
    FROM
        (
            SELECT
                T.[start_date]
                , T.end_date
                , T.comments
                , T.id
                , ROW_NUMBER() OVER (PARTITION BY T.id ORDER BY T.[start_date]) R
            FROM
                cte C
                JOIN table2 T ON
                    C.id = T.id
                    AND T.[start_date] > C.end_date
        ) Q
    WHERE R = 1
)

SELECT
    [start_date]
    , end_date
    , comments
    , id
FROM cte
© www.soinside.com 2019 - 2024. All rights reserved.