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

时间:2015-12-11 12:28:18

标签: sql sybase sybase-iq

Bellow你可以看到表格和背景。 我希望从表格中的上下文中获取3个组,因此我希望按ABDC_IDENT进行分组,但DATE_RANK订单中断后,您可以在DATE_RANK 11之后的数据中看到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 个答案:

答案 0 :(得分:1)

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

这有用吗?

.catch()

或:

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