在 sql 中按 min() 排序

Posted

技术标签:

【中文标题】在 sql 中按 min() 排序【英文标题】:order by min() in sql 【发布时间】:2015-02-10 13:35:50 【问题描述】:

我是 oracle sql 的新手。我正在尝试理解以下代码。谁能简单地解释一下 min(amt) 如何按 asc 顺序对结果进行排序?我认为 min() 返回一个值。为什么 max(amt) 给出完全相同的结果?按 min() 排序给出了我想要的结果,但试图了解它是如何做到的。

select (case when amt > 200 then '>200'
             when amt > 100 then  '>100'
          else '>50'
        end)
count(distinct orderno)
from xyz
where order_date between '...' and sysdate
group by (case when amt > 200 then '>200'
             when amt > 100 then  '>100'
          else '>50'
        end)
order by min(amt)

Result:
> 50
>100
>200

【问题讨论】:

你在那个查询中有一个 group by 子句,否则你应该得到ORA-00937: not a single-group group function。如果不太长,请显示您的实际查询 - 或者提供一些我们可以调查的测试用例。 min(amt) 在您指定的任何组中按amt 的最小值排序。我认为您可能会将minmax 与排序方向(ascdesc)混淆。 【参考方案1】:

目标是按分组对结果进行排序。值是:

'>50' '>100' '>200'

事实上,以上对它们来说是“自然”的顺序。但是,数据库的排序是按字母顺序排列的,因此:

'>100' '>200' '>50'

为了以正确的顺序获取 bin,需要从每个 bin 中获取样本值(这些 bin 是不相交的,因此任何值都可以)。通过取最小值,得到的 bin 的顺序是正确的。

顺便说一句,如果它们在左侧填充为零,您可以按箱排序:

'>050' '>100' '>200'

那么字母顺序将匹配直观的顺序。

【讨论】:

【参考方案2】:

您可以尝试以下方法 - 您需要按数字列排序以获得所需的结果:

SELECT '>'||round_amt AS result, order_cnt FROM (
    SELECT CASE WHEN amt > 200 THEN 200 WHEN amt > 100 THEN 100 ELSE 50 END AS round_amt
         , COUNT(DISTINCT orderno) AS order_cnt
      FROM xyz
     WHERE order_date BETWEEN '...' AND SYSDATE
     GROUP BY CASE WHEN amt > 200 THEN 200 WHEN amt > 100 THEN 100 ELSE 50 END
) ORDER BY round_amt

【讨论】:

以上是关于在 sql 中按 min() 排序的主要内容,如果未能解决你的问题,请参考以下文章

Access 2010 SQL--在交叉表查询中按聚合函数对行进行排序

SQL:按条件从不同表中按计数排序

如何在 SQL Server 中按日期列排序的组中对列进行排名

oracle中按CPU资源消耗排序SQL

C# 需要将 sql 中的数据放入 DataGridView 并在行中按日期排序

在 PyQt 模型中按多列排序