2012-07-18 34 views
0

是否有可能運行一個查詢,並得到結果集A按年齡字段desc排序 然後查詢結果A的任何記錄,可以說一個顏色字段等於5 和組匹配字段,由高柱遞減 對它們進行排序,並返回所有結果一次中:這是一個可能的子查詢與標準的SQL

因此數據可能是這樣的:

第1部分
age color height 
4 5  7 
3 6  1 
2 9  2 
6 5  3 

輸出將產量(按年齡分類)

查詢的最後一部分的
age color height 
6 5  1 
4 5  7 
3 6  2 
2 9  3 

輸出將產生(子集等顏色,由高排序):

age color height 
4 5  7 
6 5  1 
3 6  2 
2 9  3 
+0

你的描述似乎不符合你的例子(年齡desc似乎與最終結果沒有任何關係)。爲什麼按年齡排序呢? – Bruno 2012-07-18 21:24:31

+0

@Bruno - 顯然,只有在有不同顏色的情況下,「age」的順序纔會下降,對於相同的順序,它必須按照「height」排序。我知道,混淆 – Lamak 2012-07-18 21:25:52

+0

@Lamak,我想我理解你的意思,但這個例子有點混亂。仍然不知道如何從第一排到第二排。 6 5 1從哪裏來? – Bruno 2012-07-18 22:35:42

回答

3

您的示例有點令人困惑,因爲您可以通過使用ORDER BY color, height DESC(似乎行數太少)輕鬆實現相同的結果。

據我理解你的問題,你在每減少age第一反正排序真正感興趣的,但你也想重新排列的一組具有相同color價值,如果他們是連續的,當排序行年齡。

您可以通過使用window functions(更具體地說,通過對結果進行分區)來實現所需的功能。這應該是"standard" SQL (SQL:2003),儘管它不會被所有的SQL RDMBS支持(據我所知,特別是不被MySQL支持)。

這裏是PostgreSQL (8.4 or above)一個工作示例:

CREATE TABLE test_table(
    age INTEGER, 
    color INTEGER, 
    height INTEGER 
); 
INSERT INTO test_table(age, color, height) VALUES (7, 10, 1); 
INSERT INTO test_table(age, color, height) VALUES (6, 5, 1); 
INSERT INTO test_table(age, color, height) VALUES (5, 5, 10); 
INSERT INTO test_table(age, color, height) VALUES (4, 5, 7); 
INSERT INTO test_table(age, color, height) VALUES (3, 6, 2); 
INSERT INTO test_table(age, color, height) VALUES (2, 9, 3); 

查詢(見SQL Fiddle for live demo):

WITH cte AS (
    SELECT age, color, height, 
      max(age) OVER (PARTITION BY color ORDER BY age DESC, color DESC) 
       AS maxage 
     FROM test_table 
) 
SELECT age, color, height FROM cte 
    ORDER BY maxage DESC, color, height; 

結果:

age | color | height 
-----+-------+-------- 
    7 | 10 |  1 
    6 |  5 |  1 
    4 |  5 |  7 
    5 |  5 |  10 
    3 |  6 |  2 
    2 |  9 |  3 

這樣做是窗函數分配age的最大值爲maxage分配給分區內的所有行(由color分區),最初由agecolor訂購。

CTE的結果(這可能是一個子選擇)是這樣(見SQL Fiddle for live demo):

age | color | height | maxage 
-----+-------+--------+-------- 
    7 | 10 |  1 |  7 
    2 |  9 |  3 |  2 
    3 |  6 |  2 |  3 
    6 |  5 |  1 |  6 
    5 |  5 |  10 |  6 
    4 |  5 |  7 |  6 

這裏,color分區之前每一行具有相同的maxage,當由有序在最終結果中,也保留了age的順序,但允許您通過height來重新排序。

(在SQL小提琴快速測試,似乎表明這工作正常的MS SQL Server 2012和Oracle 11g R2太多; SQL Server 2008中似乎不喜歡在窗口定義MAXORDER BY。)

0

無需一個子查詢 - 您可以使用二次(和三級等...)直接排序。

SELECT age, color, height 
FROM table 
ORDER BY color, height DESC 
0

你可以只指定一個副檢索鍵搞定此行爲:

SELECT * FROM table ORDER BY color, height DESC 

會產生:

age color height 
4 5  7 
6 5  1 
3 6  2 
2 9  3 
+0

是的,編輯來反映這一點。 – Oleksi 2012-07-18 21:21:54

+0

但是在這種情況下,'age'這個列的順序是正確的,而不是強迫 – Lamak 2012-07-18 21:23:37

1

您可以通過調整用於爲了通過標準做到這一點。

select t1.* 
from t1 
order by (case when color = 5 then height end) desc, 
     (case when coalesce(color, 0) <> 5 then age end) desc 

這首由排序下降高度,在顏色= 5,那麼它按年齡,這些地方之間的顏色不5.聚結只是需要NULL值的護理組中。

被告誡說,以下不工作:

order by (case when color = 5 then height else age end) desc 

此合併了身高和年齡,和值可能會重疊。