如何在 SQL 中分组和选择最小值

Posted

技术标签:

【中文标题】如何在 SQL 中分组和选择最小值【英文标题】:How to GROUP and choose lowest value in SQL 【发布时间】:2012-04-10 18:26:31 【问题描述】:

我的表格由以下字段组成:

 id  |   date_from  | date_to      |   price
 --------------------------------------------
 CK1     22-12-2012   29-12-2012       800
 CK1     22-12-2012   29-12-2012       1200
 CK2     22-12-2012   29-12-2012       1400
 CK2     22-12-2012   29-12-2012       1800
 CK2     22-12-2012   29-12-2012       2200

如何创建按 ID、DATE_FROM、DATE_TO 对结果进行分组并从价格中选择最低值的 SQL 选择。

所以结果是

 CK1     22-12-2012   29-12-2012       800
 CK2     22-12-2012   29-12-2012       1400

【问题讨论】:

【参考方案1】:

如果您的 dbms 支持 cte,那么您可以这样做;

测试数据

DECLARE @tbl TABLE
(
    id VARCHAR(100),
    date_from VARCHAR(100),
    date_to VARCHAR(100),
    price INT
)

INSERT INTO @tbl
VALUES
    ('CK1','22-12-2012','29-12-2012',800),
    ('CK1','22-12-2012','29-12-2012',1200),
    ('CK2','22-12-2012','29-12-2012',1400),
    ('CK2','22-12-2012','29-12-2012',1800),
    ('CK2','22-12-2012','29-12-2012',2200)

查询

;WITH CTE
AS
(   
    SELECT
        RANK() OVER(PARTITION BY id ORDER BY price ASC) AS RowNbr,
        tbl.*
    FROM
        @tbl AS tbl
)
SELECT
    *
FROM
    CTE
WHERE
    CTE.RowNbr=1

【讨论】:

这个方案也适用于更复杂的情况。【参考方案2】:
SELECT id, date_from, date_to, min(price)
FROM my_table
GROUP BY id, date_from, date_to

【讨论】:

【参考方案3】:

像这样:

SELECT id, date_from, date_to, MIN(price)
FROM TableName
GROUP BY id, date_from, date_to

【讨论】:

【参考方案4】:
select id, date_from, date_to, min(price)
from table
group by id, date_from, date_to

【讨论】:

如果 id 的每一行都是唯一的数字并且不能像 OP 中的示例那样重复怎么办?我们如何在不分组的情况下显示 id? 见***.com/questions/44231218/… 下面使用RANK()的方案也可以。

以上是关于如何在 SQL 中分组和选择最小值的主要内容,如果未能解决你的问题,请参考以下文章

在SQL中以破坏序列升序/降序对结果最小值/最大值进行分组

SQL查询以选择具有最小值的不同行

在 SQL 第 2 部分中以破坏序列升序/降序对结果最小值/最大值进行分组

SQL中分组时间序列的最小值和最大值

如何将时间列分别分组为 5 分钟间隔和最大值/最小值 SQL?

SQL分组查询最大值最小值