使用连接从查询中提取最大值
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%'
REMINDER
和 REMINDER_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
我想要做的是消除所有行,但那些具有 ID
或 REMINDER_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
我有一个查询,它给了我部分冗余的行。这是查询:
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%'
REMINDER
和 REMINDER_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 |
我想要做的是消除所有行,但那些具有 ID
或 REMINDER_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