【问题标题】:How to make a specific group by (window like function)如何通过(类似窗口的功能)创建特定组
【发布时间】:2016-03-17 08:53:29
【问题描述】:

您可以在下面看到表格和上下文。 我想从表中的上下文中获取 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 和当前行之间的行,欢迎任何想法,也许也可以通过其他方式完成。干杯和谢谢

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

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 |

【问题讨论】:

  • 你能用表格给我们展示一下欲望结果吗?
  • 您的 Sybase 版本是否支持窗口函数? Sybase 有很多版本,有的有,有的没有。另外,你为什么在列名中使用反引号?
  • @Juan Carlos Oropeza 我会尽快做的。
  • @Gordon Linoff 小提琴网站自己做到了,它从文本中生成了 ddl ......它在那里工作,所以我没有改变它,也许是我的错
  • 进一步澄清,Sybase IQ v.15,4 ...我不需要它是一个窗口函数...我只对最后的输出感兴趣...我只是想窗口函数是最简单/最好的解决方案

标签: sql sybase sap-iq


【解决方案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

【讨论】:

  • 您可以忽略转换日期,我已将 varchar 编辑为默认日期。 ;)
猜你喜欢
  • 1970-01-01
  • 2011-01-24
  • 2011-06-30
  • 1970-01-01
  • 2010-09-18
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多