sql:query以获取特定列的值的最后更改

rqmkfv5c  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(333)

所以我有这张产品信息表。每次更改特定产品时,都会插入一行新值,包括时间戳和修改它的用户。
为了显示信息,我搜索特定产品的最新行(由product\u id列标识)。
但现在我需要知道谁是最后一个修改了一个名为status的特定列的人。
假设我的table是这个
所以本质上我需要编写一个查询,告诉我给定列的最后一次更改是什么时候。

product_id | name | status   | user | keyid
--------------------------------------------
598        | prrr | 0        | john | 10
598        | prod | 1        | jane | 11
456        | abcd | 2        | mac  | 12
598        | prdd | 2        | kate | 13
598        | rdpd | 2        | jane | 14
456        | prrr | 3        | john | 15
456        | abbb | 3        | kate | 16

所以598产品的最新信息是

598 rdpd 2 jane 14

但最后一个被释放的人是凯特
产品456的最新信息如下

456 abbb 3 kate 16

但最后一个被释放的人是约翰
因此,理想情况下,我希望编写一个返回

598 kate 13
456 john 15

我甚至还不知道如何写这样的查询,所以我想知道是否有人能帮我。

68bkxrlz

68bkxrlz1#

可以使用窗口函数:

select t.*
from (select t.*, row_number() over (partition by productid order by keyid desc) as seqnum
      from (select t.*,
                   lag(status) over (partition by productid order by keyid) as prev_status
            from t
           ) t
      where prev_status is null or prev_status <> status
     ) t
where seqnum = 1;

最里面的子查询将每个值与其前一个值进行比较。中间子查询枚举状态发生更改的产品的每一行。外部查询筛选以获取最新的查询。

bqucvtff

bqucvtff2#

如果您的数据库不支持窗口函数,那么逻辑就要复杂一些。
作为初学者,请考虑下面的查询,它为您提供了第一个 idkey 具有最新 statusproduct_id :

select product_id, min(keyid)
from mytable t
where not exists (
    select 1 
    from mytable t1 
    where t1.product_id = t.product_id and t1.status <> t.status and t1.keyid > t.keyid
)
group by product_id

这将返回:

product_id | min(keyid)
---------: | ---------:
       598 |         13
       456 |         15

然后可以使用此结果集筛选表:

select t.*
from mytable t
where t.keyid in (
    select min(keyid)
    from mytable t
    where not exists (
        select 1 
        from mytable t1 
        where t1.product_id = t.product_id and t1.status <> t.status and t1.keyid > t.keyid
    )
    group by product_id
)

结果:

product_id | name | status | user | keyid
---------: | :--- | -----: | :--- | ----:
       598 | prdd |      2 | kate |    13
       456 | prrr |      3 | john |    15

db小提琴演示

相关问题