按组的最大行数
Max rows by group
当前 SQL:
select t1.*
from table t1
where t1.id in ('2', '3', '4')
当前结果:
id | seq
---+----
3 | 5
2 | 7
2 | 5
3 | 7
4 | 3
尝试 select 最大值:
select t1.*
from table t1
where t1.id in ('2', '3', '4')
and t1.seq = (select max(t2.seq)
from table2 t2
where t2.id = t1.id)
这显然不起作用,因为我使用的是 in
列表。如何调整我的 SQL 以获得这些预期结果:
id | seq
---+----
2 | 7
3 | 7
4 | 3
此 SQL 查询将为您提供来自个人 ID 的最大序列。
SELECT t1.*
FROM t1
WHERE t1.id in ('2', '3', '4')
AND NOT EXISTS (
SELECT *
FROM t1 t2
WHERE t2.id = t1.id
AND t2.seq > t1.seq
Group By 是你的朋友:
SELECT
id,
MAX(seq) seq
FROM TABLE
GROUP BY id
编辑:对评论的回应。要从匹配最大序列和 ID 的 table 中获取其余数据,只需连接回 table:
SELECT t1.*
FROM TABLE t1
INNER JOIN (
SELECT
id
MAX(seq) as seq
FROM TABLE
GROUP BY id
) as t2
on t1.id = t2.id
and t1.seq = t2.seq
编辑:Gordon 和 Jean-Francois 是正确的,您也可以使用 ROW_NUMBER() 分析函数来获得相同的结果。您需要检查应用程序的性能差异(我没有检查)。这是一个例子:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (
PARTITION BY id
ORDER BY seq DESC) as row_num
,*
FROM TABLE
) as TMP
WHERE row_num = 1
select *
from table
where (id,seq) in
(
select id,max(seq)
from table
group by id
having id in ('2','3','4')
);
也就是说如果id
and/orseq
完全是那个table的PK的一部分。
这是另一个例子,使用我之前在评论中提到的first/last方法:
with sd as (select 3 id, 5 seq, 1 dummy from dual union all
select 2 id, 7 seq, 2 dummy from dual union all
select 2 id, 5 seq, 3 dummy from dual union all
select 3 id, 7 seq, 4 dummy from dual union all
select 3 id, 7 seq, 5 dummy from dual union all
select 4 id, 3 seq, 6 dummy from dual)
select id,
max(seq) max_seq,
max(dummy) keep (dense_rank first order by seq desc) max_rows_dummy
from sd
group by id;
ID MAX_SEQ MAX_ROWS_DUMMY
---------- ---------- --------------
2 7 2
3 7 5
4 3 6
keep (dense_rank first order by ...)
位请求保留与行顺序列表中排名 1 关联的值。 max(...)
位是为了防止不止一行的排名为 1;这只是打破联系的一种方式。
当前 SQL:
select t1.*
from table t1
where t1.id in ('2', '3', '4')
当前结果:
id | seq
---+----
3 | 5
2 | 7
2 | 5
3 | 7
4 | 3
尝试 select 最大值:
select t1.*
from table t1
where t1.id in ('2', '3', '4')
and t1.seq = (select max(t2.seq)
from table2 t2
where t2.id = t1.id)
这显然不起作用,因为我使用的是 in
列表。如何调整我的 SQL 以获得这些预期结果:
id | seq
---+----
2 | 7
3 | 7
4 | 3
此 SQL 查询将为您提供来自个人 ID 的最大序列。
SELECT t1.*
FROM t1
WHERE t1.id in ('2', '3', '4')
AND NOT EXISTS (
SELECT *
FROM t1 t2
WHERE t2.id = t1.id
AND t2.seq > t1.seq
Group By 是你的朋友:
SELECT
id,
MAX(seq) seq
FROM TABLE
GROUP BY id
编辑:对评论的回应。要从匹配最大序列和 ID 的 table 中获取其余数据,只需连接回 table:
SELECT t1.*
FROM TABLE t1
INNER JOIN (
SELECT
id
MAX(seq) as seq
FROM TABLE
GROUP BY id
) as t2
on t1.id = t2.id
and t1.seq = t2.seq
编辑:Gordon 和 Jean-Francois 是正确的,您也可以使用 ROW_NUMBER() 分析函数来获得相同的结果。您需要检查应用程序的性能差异(我没有检查)。这是一个例子:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (
PARTITION BY id
ORDER BY seq DESC) as row_num
,*
FROM TABLE
) as TMP
WHERE row_num = 1
select *
from table
where (id,seq) in
(
select id,max(seq)
from table
group by id
having id in ('2','3','4')
);
也就是说如果id
and/orseq
完全是那个table的PK的一部分。
这是另一个例子,使用我之前在评论中提到的first/last方法:
with sd as (select 3 id, 5 seq, 1 dummy from dual union all
select 2 id, 7 seq, 2 dummy from dual union all
select 2 id, 5 seq, 3 dummy from dual union all
select 3 id, 7 seq, 4 dummy from dual union all
select 3 id, 7 seq, 5 dummy from dual union all
select 4 id, 3 seq, 6 dummy from dual)
select id,
max(seq) max_seq,
max(dummy) keep (dense_rank first order by seq desc) max_rows_dummy
from sd
group by id;
ID MAX_SEQ MAX_ROWS_DUMMY
---------- ---------- --------------
2 7 2
3 7 5
4 3 6
keep (dense_rank first order by ...)
位请求保留与行顺序列表中排名 1 关联的值。 max(...)
位是为了防止不止一行的排名为 1;这只是打破联系的一种方式。