【问题标题】:How to find the maximum value in a range of following rows - SQL Teradata如何在以下行的范围内找到最大值 - SQL Teradata
【发布时间】:2020-08-18 22:40:47
【问题描述】:

我有一个包含以下列的表格:

account, validity_date, validity_month, amount

对于每一行,我想在下个月的行范围内找到最大数量。

account   validity_date   validity_month   amount    **required_column**
-------   -------------   ---------------  -------   ----------------
123        15oct2019       201910           400         1000
123        20oct2019       201910           500         1000
123        15nov2019       201911           1000        800
123        20nov2019       201911           0           800
123        15dec2019       201912           800

当我尝试这段代码时,我得到了下一行的值,但这不是我需要的(每个月可能不止一行):

MAX(amount) OVER (PARTITION BY account ORDER BY validity_date 
                  ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_max_amount
account   validity_date   validity_month   amount    next_max_amount-INVALID
-------   -------------   ---------------  -------   ----------------------
123        15oct2019       201910           400         500
123        20oct2019       201910           500         1000
123        15nov2019       201911           1000        0
123        20nov2019       201911           0           800
123        15dec2019       201912           800

【问题讨论】:

    标签: sql date teradata partitioning window-functions


    【解决方案1】:
    SELECT dt.*,
       -- fill the NULLs with the previous month's max
       Last_Value(CASE WHEN rn = 1 THEN current_max END IGNORE NULLS)
       Over (PARTITION BY account
             ORDER BY validity_date DESC
             ROWS BETWEEN Unbounded Preceding AND 1 Preceding)
    FROM
     (
       SELECT t.*,
          -- maximum of current month
          Max(amount)
          Over (PARTITION BY account, validity_month) AS current_max,
          -- to identify the 1st row for each month in the next step
          Row_Number()
          Over (PARTITION BY account, validity_month
                ORDER BY validity_date) AS rn      
       FROM tab AS t
     ) AS dt
    

    【讨论】:

      【解决方案2】:

      假设validity_month为日期类型列:

      select s1.account, s1.validity_date, s1.validity_month, s1.amount, 
        s2.amount required_column
      from your_table s1
      left join (select max(amount) amount, validity_month from your_table group by 2) s2
      on (
        to_char(s1.validity_month.'yyyymm')=to_char(add_month(s2.validity_month,1),'yyyymm')
      )
      

      【讨论】:

        猜你喜欢
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 2019-11-08
        • 2020-07-29
        • 2015-10-25
        • 1970-01-01
        • 2022-01-04
        相关资源
        最近更新 更多