【问题标题】:How to add a constant using Lag/Max Window Function?如何使用 Lag/Max Window Function 添加常量?
【发布时间】:2016-09-14 04:51:53
【问题描述】:

请参考下表。我的表有 ID、ID_Type、Lag 和 Row_Num。我需要在下面创建“New_Col”列。我使用MAX窗口功能接近,但我仍然没有成功。任何帮助将不胜感激 - 如果窗口功能不是要走的路,我绝对愿意接受建议。

这是我用来得出下面示例表的 SQL:

SELECT ID,
       ID_TYPE,
       LAG(ID_TYPE) OVER (ORDER BY Row_Num) AS Lag,
       Row_Num
FROM (SELECT ID,
             CASE WHEN ID LIKE '%Exc%' 
                  THEN ID
             END AS ID_Type,
             Row_Num
      FROM Source_Table)

样本表:

ID       ID_Type  Lag       Row_Num
Exc      Exc                1
10R46             Exc       2
10R46                       3
100R91                      4
Non_Exc  Non_Exc            5 
10R91             Non_Exc   6
10M95                       7

期望的输出:

ID       ID_Type  Lag       New_Col  Row_Num
Exc                         Exc      1
10R46    Exc                Exc      2
10R46             Exc       Exc      3
100R91                      Exc      4
Non_Exc  Non_Exc            Non_Exc  5 
10R91             Non_Exc   Non_Exc  6
10M95                       Non_Exc  7

【问题讨论】:

  • 请提供用于创建源表的 SQL 和一些示例数据。看起来你在一条糟糕的道路上走了一半,并要求我们从那里继续前进。我的印象是,与您在这里开始的解决方案完全不同的解决方案将是最好的。
  • @iamdave,源表实际上是来自物业管理系统的计划(Excel)报告。我没有创建表格,而是将 Excel 文件加载到 Domo(BI 工具)中,然后将文件转换为表格。在 Domo 中,我可以使用 Redshift 或 MySQL 进行额外的 ETL 工作。
  • 您的预期输出是什么?考虑输入样本数据..
  • @KannanKandasamy,“期望输出”中的“New_Col”是我希望实现的。
  • @izzy84,你能用简单的英语解释一下New_Col背后的逻辑吗?我很好奇,因为第 5 行似乎将 Non_Exc 作为新的 col 值,而您的 max(lag) 不会在第 5 行遇到 Non_Exc 的滞后值。

标签: sql-server tsql amazon-redshift window-functions


【解决方案1】:

一种方法是生成范围键

Declare @YourTable table (ID varchar(50),ID_Type varchar(50),Lag varchar(50),Row_Num int)
Insert into @YourTable values
('Exc','Exc','',1),
('10R46','','Exc',2),
('10R46','','',3),
('100R91','','',4),
('Non_Exc','Non_Exc','',5),
('10R91','','Non_Exc',6),
('10M95','','',7)

;with cteR1 as (Select ID_Type,R1=min(Row_Num) from @YourTable Where ID_Type<>'' Group by ID_Type
   ), cteR2 as (Select A.ID_Type,A.R1,R2=isnull(min(B.R1),9999)-1 From cteR1 A Left Join cteR1 B on (B.R1>A.R1) Group By A.ID_Type,A.R1)
Select A.ID
      ,A.ID_Type
      ,A.Lag 
      ,New_Col=B.ID_Type
      ,A.Row_Num
 From @YourTable A
 Join cteR2 B on Row_Num between R1 and R2
 Order By Row_Num

返回

ID      ID_Type Lag     Row_Num New_Col
Exc     Exc             1       Exc
10R46           Exc     2       Exc
10R46                   3       Exc
100R91                  4       Exc
Non_Exc Non_Exc         5       Non_Exc
10R91           Non_Exc 6       Non_Exc
10M95                   7       Non_Exc

【讨论】:

    【解决方案2】:

    向 LAG 窗口函数添加 IGNORE NULLS 规范可以实现我想要的。

    SELECT ID,
           ID_TYPE,
           LAG(ID_TYPE IGNORE NULLS) OVER (ORDER BY Row_Num) AS Lag,
           Row_Num
    FROM (SELECT ID,
                 CASE WHEN ID LIKE '%Exc%' 
                      THEN ID
                 END AS ID_Type,
                 Row_Num
          FROM Source_Table)
    

    返回:

    ID       ID_Type  Lag       Row_Num
    Exc      Exc                1
    10R46             Exc       2
    10R46             Exc       3
    100R91            Exc       4
    Non_Exc  Non_Exc  Exc       5 
    10R91             Non_Exc   6
    10M95             Non_Exc   7
    

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多