我在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
如何实现这种复杂的排序?甚至可以通过查询来实现吗?
答案 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