我有一张表如下:
ID NAME AMOUNT
______________________
1 A 3
1 B 4
2 C 18
4 I 2
4 P 9
Run Code Online (Sandbox Code Playgroud)
我想要每个 ID 的最小值(金额),但我仍然想显示其名称。所以我想要这个:
ID NAME min(AMOUNT)
______________________
1 A 3
2 C 18
4 I 2
Run Code Online (Sandbox Code Playgroud)
ID 可以出现多次,名称也是如此。我试过这个:
SELECT ID, NAME, min(AMOUNT) FROM TABLE
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)
但这当然是一个错误,因为我必须
GROUP BY ID, NAME
Run Code Online (Sandbox Code Playgroud)
但后来我明白了
ID NAME AMOUNT
______________________
1 A 3
1 B 4
2 C 18
4 I 2
4 P 9
Run Code Online (Sandbox Code Playgroud)
我明白为什么,它会查找 ID + NAME 的每个组合的最小值(AMOUNT)。所以我的问题基本上是,如何选择多列(ID、NAME、AMOUNT)并仅获取一列的最小值,同时仍显示其他列?
我对 SQL 很陌生,但我似乎找不到答案。
如果您使用 PostgreSQL、SQL Server、MySQL 8.0 和 Oracle,请使用窗口函数尝试以下操作row_number()。
如果您有一个金额相似的 id,那么您可以dense_rank()使用row_number()
这是演示。
select
id,
name,
amount
from
(
select
*,
row_number() over (partition by id order by amount) as rnk
from yourTable
) val
where rnk = 1
Run Code Online (Sandbox Code Playgroud)
输出:
| id | name | amount |
| --- | ---- | ------ |
| 1 | A | 3 |
| 2 | C | 18 |
| 4 | I | 2 |
Run Code Online (Sandbox Code Playgroud)
不使用窗函数的第二种选择
select
val.id,
t.name,
val.amount
from myTable t
join
(
select
id,
min(amount) as amount
from myTable
group by
id
) val
on t.id = val.id
and t.amount = val.amount
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2166 次 |
| 最近记录: |