SQL排序按复杂排序

时间:2014-05-12 20:48:11

标签: sql oracle sql-order-by

我在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

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

将part part,locker,serial#组合在一起,并在每个组内按升序或降序对描述进行排序WHILE还确保每个组的第一条记录也按升序或降序正确排序(冲突应按所需顺序排序)部分,储物柜,连续)。例如:

排序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

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

1 个答案:

答案 0 :(得分: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