【问题标题】:Group by while discarding old data in queryGroup by 同时丢弃查询中的旧数据
【发布时间】:2018-11-13 08:04:50
【问题描述】:

我有一张表(Oracle):

price
--------
integer id (pk)
integer part_id (fk)
number amount
timestamp change_timestamp

每当零件价格发生变化时,软件(不是我的)都会在此表中添加一个新行。它没有更改数据并且每个部分只有一个条目,而是在表中添加了一个新行。然后,该软件会查找最新条目。但“旧”数据在表中徘徊。

我正在尝试编写一个查询,该查询为我提供 a) 当前(最新)价格和 b) 输入价格的日期。

我写了这个查询:

select part_id, amount, max(change_timestamp)
from price
group by part_id, amount

但这会返回该部分的每个条目,甚至是旧条目。

如何在丢弃旧的、不相关的数据的同时返回最新日期和该日期的金额?

不,要更改的不是我的数据库或我的软件。

【问题讨论】:

    标签: sql oracle group-by greatest-n-per-group


    【解决方案1】:

    但这会返回该部分的每个条目,甚至是旧条目。

    这是因为您同时按part_id, amount 分组,这将考虑为每个part_id 设置多个组,因为每条记录的数量不同。 要获得part_idMAX(timestamp),只需在group byselect 中删除amount 即可。如果你也想要数量,那么

    您可以使用MAX 解析函数并找到带有change_timestamp 的记录

     SELECT part_id
        ,amount
        ,change_timestamp
    FROM (
        SELECT p.*
            ,max(change_timestamp) OVER (PARTITION BY part_id) max_change_timestamp
        FROM price p
        )
    WHERE change_timestamp = max_change_timestamp;
    

    或者使用您已经在另一个答案中找到的row_number

    或使用相关查询:

    SELECT part_id
        ,amount
        ,change_timestamp
    FROM price  p1
    WHERE change_timestamp = (
            SELECT MAX(change_timestamp)
             FROM price p2
            WHERE p2.part_id = p1.part_id
            );
    

    LAST(但并非最不重要的)聚合函数:

    SELECT part_id
        ,MAX(amount) KEEP DENSE_RANK(LAST ORDER BY change_timestamp)
        ,MAX(change_timestamp)
    GROUP BY part_id;
    

    【讨论】:

    • 你的中间查询是我使用的那个
    【解决方案2】:

    使用ROW_NUMBER() 查找part_id 的最新条目。

    SELECT part_id
        ,amount
        ,change_timestamp
    FROM (
        SELECT price.*
            ,ROW_NUMBER() OVER (PARTITION BY part_id ORDER BY change_timestamp DESC) as rn
        FROM price  
        )   
    WHERE rn = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多