获取一列的最小值但选择多列

jfo*_*ies 3 sql

我有一张表如下:

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 很陌生,但我似乎找不到答案。

zea*_*ous 6

如果您使用 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)