使用连接从查询中提取最大值

Extract a max value from a query with joins

我有一个查询,它给了我部分冗余的行。这是查询:

select r.id, u.reminder_id, r.name, r.remark, u.user_id
    from REMINDER_USERS u
    inner join REMINDER r 
        on r.id = u.reminder_id
    inner join DEVICE d 
        on d.id = (regexp_replace(r.origin_values, '[^0-9]', '')) 
    where r.name like '%Interne%'

REMINDERREMINDER_USERS 之间存在外键约束。所以 REMINDER_USERS 中的行是 REMINDER.

的子数据

以下是查询结果的示例:

Line ID REMINDER_ID NAME REMARK USER_ID
1 1940 1940 Interne_3324 Interne Pruefung 10
2 1940 1940 Interne_3324 Interne Pruefung 11
3 1972 1972 Interne_2379 Interne Pruefung 10
4 1972 1972 Interne_2379 Interne Pruefung 11
5 1934 1934 Interne_3324 Interne Pruefung 10
6 1934 1934 Interne_3324 Interne Pruefung 11
7 3103 3103 Interne_3324 Interne Pruefung 10
8 3103 3103 Interne_3324 Interne Pruefung 11
9 4100 4100 Interne_2379 Interne Pruefung 10
10 4100 4100 Interne_2379 Interne Pruefung 11

我想要做的是消除所有行,但那些具有 IDREMINDER_ID 最大值的行。在示例中,仅保留名称为“Interne_3324”的提醒的第 7 行和第 8 行以及名称为“Interne_2379”的提醒的第 9 行和第 10 行。

我在第一次连接时用 select (max)id 尝试了几个子查询,但这没有用。

非常感谢任何帮助,提前致谢!

我认为你可以使用 dense_rank()rank() 和一些额外的过滤:

select r.*
from (select r.id, u.reminder_id, r.name, r.remark, u.user_id,
             dense_rank() over (order by u.reminder_id desc) as seqnum
      from REMINDER_USERS u join
           REMINDER r 
           on r.id = u.reminder_id join
           DEVICE d 
           on d.id = (regexp_replace(r.origin_values, '[^0-9]', '')) 
      where r.name like '%Interne%' and
            r.name <> 'Interne_2379'
     ) r
where seqnum = 1;

注意:如果您确实想要每个用户最近的提醒,请使用:

             dense_rank() over (partition by u.user_id order by u.reminder_id desc) as seqnum