【问题标题】:Retrieve last record in a group based on string - DB2基于字符串检索组中的最后一条记录 - DB2
【发布时间】:2021-04-15 22:52:21
【问题描述】:

我在 DB2 数据库中有一个包含事务数据的表,我想检索每个位置和产品的最后一条记录。不幸的是,日期存储为 YYYYMMDD 字符串。没有我可以键入的交易 ID 或类似字段。没有主键。

DATE LOCATION PRODUCT QTY
20210105 A P1 4
20210106 A P1 3
20210112 A P1 7
20210104 B P1 3
20210105 B P1 1
20210103 A P2 6
20210105 A P2 5

我想检索显示每个位置、每个产品的最后一笔交易的结果,所以结果应该是:

DATE LOCATION PRODUCT QTY
20210112 A P1 7
20210105 B P1 1
20210105 A P2 5

我查看了类似问题的答案,但由于某种原因无法从解决类似问题的答案跳转到适用于我的环境的代码。

编辑:我尝试了下面的代码,取自this question 的答案。它为单个位置/部件组合返回多行。我已经尝试过该问题中的其他答案,但没有运气让它们执行。

SELECT * 
FROM t 
WHERE DATE > '20210401' AND DATE in (SELECT max(DATE) 
FROM t GROUP BY LOCATION) order by PRODUCT desc

谢谢!

【问题讨论】:

  • 请分享您对这个问题的尝试。

标签: sql db2


【解决方案1】:

您可以使用ROW_NUMBER()。例如,如果您的表名为t,您可以这样做:

select * 
from (
  select *,
    row_number() over(partition by location, product 
                      order by date desc) as rn
  from t
) x
where rn = 1

【讨论】:

    【解决方案2】:

    您可以使用lead() 获取更改前的最后一行:

    select t.*
    from (select t.*,
                 lead(date) over (partition by location, product order by date) as next_lp_date,
                 lead(date) over (order by date) as next_date
          from t
         ) t
    where next_lp_date is null or next_lp_date <> next_date
    

    【讨论】:

      【解决方案3】:

      看起来您只需要匹配子选择中的键。

      SELECT * 
      FROM t T1
      WHERE DATE > '20210401' 
      AND DATE in (SELECT max(DATE) FROM t T2 WHERE T2.Location = T1.Location and T2.Product=T1.Product)
      

      【讨论】:

        猜你喜欢
        • 2014-08-12
        • 1970-01-01
        • 2010-11-21
        相关资源
        最近更新 更多