gpt4 book ai didi

围绕间隙的 SQL 分组

转载 作者:行者123 更新时间:2023-12-04 11:45:45 28 4
gpt4 key购买 nike

在 SQL Server 2005 中,我有一个包含如下数据的表:

WTN------------Date  
555-111-1212 2009-01-01
555-111-1212 2009-01-02
555-111-1212 2009-01-03
555-111-1212 2009-01-15
555-111-1212 2009-01-16
212-999-5555 2009-01-01
212-999-5555 2009-01-10
212-999-5555 2009-01-11

从中我想提取 WTN, Min(Date), Max(Date) 是我要 也破每当日期之间存在差距时,因此根据上述数据,我的结果应如下所示:
WTN------------ MinDate---- MaxDate  
555-111-1212 2009-01-01 2009-01-03
555-111-1212 2009-01-15 2009-01-16
212-999-5555 2009-01-01 2009-01-01
212-999-5555 2009-01-10 2009-01-11
  • 如何在 SQL Select/Group By 中执行此操作?
  • 这是否可以在没有表格或列表的情况下完成我想在(此处为日期)中找出差距的值?
  • 最佳答案

    为什么每个人都如此坚决反对使用 table 来做这种事情?一个数字表或一个日历表占用的空间很小,如果引用足够多的话,它可能在内存中。您还可以使用 ROW_NUMBER() 非常轻松地动态派生数字表。使用数字表有助于理解查询。但这里有一个不太直接的例子,我不久前从 Plamen Ratchev 那里学到的一个技巧,希望它有所帮助。

    DECLARE @wtns TABLE
    (
    WTN CHAR(12),
    [Date] SMALLDATETIME
    );

    INSERT @wtns(WTN, [Date])
    SELECT '555-111-1212','2009-01-01'
    UNION ALL SELECT '555-111-1212','2009-01-02'
    UNION ALL SELECT '555-111-1212','2009-01-03'
    UNION ALL SELECT '555-111-1212','2009-01-15'
    UNION ALL SELECT '555-111-1212','2009-01-16'
    UNION ALL SELECT '212-999-5555','2009-01-01'
    UNION ALL SELECT '212-999-5555','2009-01-10'
    UNION ALL SELECT '212-999-5555','2009-01-11';

    WITH x AS
    (
    SELECT
    [Date],
    wtn,
    part = DATEDIFF(DAY, 0, [Date])
    + DENSE_RANK() OVER
    (
    PARTITION BY wtn
    ORDER BY [Date] DESC
    )
    FROM @wtns
    )
    SELECT
    WTN,
    MinDate = MIN([Date]),
    MaxDate = MAX([Date])
    FROM
    x
    GROUP BY
    part,
    WTN
    ORDER BY
    WTN DESC,
    MaxDate;

    关于围绕间隙的 SQL 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1590166/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com