【问题标题】:order by min() in sql在 sql 中按 min() 排序
【发布时间】: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)混淆。

标签: sql oracle sql-order-by min


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2017-02-27
      • 2018-06-20
      • 2018-08-14
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      相关资源
      最近更新 更多