在 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
的最小值排序。我认为您可能会将min
和max
与排序方向(asc
和desc
)混淆。
【参考方案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 Server 中按日期列排序的组中对列进行排名