首页 文章

如何通过(窗口函数)创建特定组

提问于
浏览
0

你可以看到表格和背景 . 我想从表格中的上下文中获取3个组,所以我想按 ABDC_IDENT 进行分组,但是当 DATE_RANK 11到达后, DATE_RANK 命令中断,因为你可以在数据中看到1,2(因为它是B组)然后它继续为A组排名(顺序是 VARIOUS_DATES ) .

我想要得到的是3组,第一组是A组排名1到11,第二组是B级1,2,第三组应该是A组,但排名从12到21.我希望这是明确的大家 .

我正在试验UNBOUNDED PRECEDING和当前行之间的行,欢迎任何想法,也许它也可以用其他方式完成 . 干杯和thx

这是我的小提琴,所以你可以自己构建它:

CREATE TABLE Table1
    (ABDC_IDENT varchar(5), VARIOUS_DATES date, DATE_RANKS int)
;

INSERT INTO Table1
    (ABDC_IDENT, VARIOUS_DATES, DATE_RANKS)
VALUES
    ('A', '31.12.2010', 1),
    ('A', '31.01.2011', 2),
    ('A', '28.02.2011', 3),
    ('A', '31.03.2011', 4),
    ('A', '29.04.2011', 5),
    ('A', '31.05.2011', 6),
    ('A', '30.06.2011', 7),
    ('A', '29.07.2011', 8),
    ('A', '31.08.2011', 9),
    ('A', '30.09.2011', 10),
    ('A', '31.10.2011', 11),
    ('B', '30.11.2011', 1),
    ('B', '30.12.2011', 2),
    ('A', '31.01.2012', 12),
    ('A', '29.02.2012', 13),
    ('A', '30.03.2012', 14),
    ('A', '30.04.2012', 15),
    ('A', '31.05.2012', 16),
    ('A', '29.06.2012', 17),
    ('A', '31.07.2012', 18),
    ('A', '31.08.2012', 19),
    ('A', '28.09.2012', 20),
    ('A', '31.10.2012', 21)
;

然后将所需结果插入另一个表中

Table2

  GROUP_ABC |  MIN_DATE |  MAX_DATE  |
       A    |31.12.2010 | 31.10.2011 |
       B    |30.11.2011 | 30.12.2011 |
       C    |31.01.2012 | 31.10.2012 |

1 回答

  • 1

    我认为您可以使用转换格式104来处理日期字符串 .

    这有用吗?

    select
        substring('ABCDEF', row_number() over (order by min(VARIOUS_DATES)), 1) as GROUP_ABC,
        min(VARIOUS_DATES) as MIN_DATE,
        max(VARIOUS_DATES) as MAX_DATE
    from (
        select
            ABDC_IDENT,
            convert(date, VARIOUS_DATES, 104) as VARIOUS_DATES
            row_number() over (order by convert(date, VARIOUS_DATES, 104)) - DATE_RANKS as grp
        from Table1
    ) data
    group by ABDC_IDENT, grp
    

    要么:

    select
        substring('ABCDEF', row_number() over (order by MIN_DATE), 1) as GROUP_ABC,
        MIN_DATE, MAX_DATE
    from (
        select
            ABDC_IDENT as GROUP_ABC,
            min(VARIOUS_DATES) as MIN_DATE,
            max(VARIOUS_DATES) as MAX_DATE
        from (
            select
                ABDC_IDENT,
                convert(date, VARIOUS_DATES, 104) as VARIOUS_DATES
                row_number()
                    over (order by convert(date, VARIOUS_DATES, 104)) - DATE_RANKS as grp
        from Table1
        ) data
        group by ABDC_IDENT, grp
    ) t
    

相关问题