2014-05-12 48 views
0

我在甲骨文的SQL方言如下表(被称为有一些Java代码)SQL命令通过复杂的排序

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 

我正在寻找一种方式做如下排序:

集团的一部分,locker,serial#在一起并按照升序或降序排列描述,同时确保每个组的第一条记录也按照升序或降序正确排序(冲突应按照期望的顺序排列,串行)。因此,例如:

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

什么SQL方言? –

+0

你使用了哪个数据库?我不明白为什么2 7 17 Gamma是第一排。 –

回答

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 
+0

谢谢!这工作很好! – Evilsithgirl