【问题标题】:SQL Order By Complex SortSQL 按复杂排序排序
【发布时间】:2014-06-30 09:04:54
【问题描述】:

我在 Oracle SQL 方言中有下表(使用一些 java 代码调用)

Part # | Locker # | Serial # | Description
  1         1          1       Alpha
  1         1          1       Beta
  1         1          1       Gamma
  2         1          15      Alpha
  2         7          17      Gamma
  2         7          21      Beta

我正在寻找一种方法来进行以下排序:

将零件、储物柜、序列号组合在一起,并在每个组内按升序或降序对描述进行排序,同时确保每个组的第一条记录也按升序或降序正确排序(冲突应按所需顺序排序部分,储物柜,串行)。比如:

对 DESC 进行排序会产生:

Part # | Locker # | Serial # | Description
  2         7          17      Gamma

  1         1          1       Gamma
  1         1          1       Beta
  1         1          1       Alpha

  2         7          21      Beta

  2         1          15      Alpha

如何实现这种复杂类型的排序?甚至可以通过查询来实现吗?

【问题讨论】:

  • 您使用的是什么数据库?而且我不明白为什么 2 7 17 Gamma 是第一行。

标签: sql oracle sql-order-by


【解决方案1】:

有趣的挑战,需要按 3 个字段分组并为该组选择最高的描述,将其保留在查询中进行排序......很好!

我在 MS-SQL 2008 中试了一下,可以在 http://sqlfiddle.com/#!3/422d2/10 看到 使用 MS T-SQL 排名函数可能有一种更简单的方法,但是这个派生的组表应该很容易在其他 SQL 中实现。

这似乎给出了您需要的排序顺序:

SELECT
  p1.*, Groups.GMaxDescr
FROM Parts p1 INNER JOIN 
  (SELECT
     p2.Part AS GPart,
     p2.Locker AS GLocker,
     p2.Serial AS GSerial,
     Max(p2.Descr) as GMaxDescr
   FROM Parts p2
   GROUP BY Part, Locker, Serial
  ) AS Groups  -- derived table of Groups with First (Max() for DESC) Name 
      -- join original rows with the Groups data for sorting
       ON p1.Part = Groups.GPart
      AND p1.Locker=Groups.GLocker
      AND p1.Serial=Groups.GSerial
ORDER BY Groups.GMaxDescr DESC,
         Part DESC,
         Locker DESC,
         Serial DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2013-10-10
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2015-10-06
    • 2015-08-25
    相关资源
    最近更新 更多