2016-02-27 66 views
3

更新:DISTINCT SQL命令

qid = 1, nick=aa, value=13, time= 20:00:01 
qid = 1, nick=bb, value=45, time= 20:00:50 
qid = 2, nick=cc, value=77, time= 20:30:50 

expected: 
qid = 1, nick=bb, value=45, time= 20:00:50 
qid = 2, nick=cc, value=77, time= 20:30:50 

我試圖執行這一行:

SELECT DISTINCT QID FROM "USERNAME"."ANSWER" WHERE Nickname =? ORDER BY Time DESC 
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY 

而且我得到這個錯誤信息:

ORDER BY子句可能不包含列'TIME',因爲查詢 指定DISTINCT,並且該列未出現在查詢 結果中。

會出現什麼問題?

+1

消息說這一切都是真的,你沒有選擇'時間'(只是QID),但你試着按順序排列,這是'DISTINCT'查詢所不允許的。 –

+0

但是我想按時間訂購 – user11001

+0

您想訂購哪個時間?例如,如果您有兩行,「{QID = 1,時間= 21:00:00}」和「{QID = 1,時間= 22:00:00}」,則查詢的結果行將爲「{ QID = 1}'但是兩次中的哪一次應該按順序排列? –

回答

2

作爲錯誤信息不能在distinct選擇列表中使用的列表示當該列中不存在Order by

select * from 
(
select row_number()over(partition by qid Order by Time desc) as Rn,* 
From yourtable 
) A 
Where RN =1 

或者如果你的數據庫不支持ROW_NUMBER然後用這個

SELECT a.* 
FROM yourtable a 
     INNER JOIN (SELECT qid, 
          Max(time) AS time 
        FROM yourtable 
        GROUP BY qid) b 
       ON a.qid = b.qid 
        AND a.time = b.time 
+2

據我所知,'DISTINCT'不能保證從它的輸入(子查詢)保留任何順序 –

+0

它不適用於我..所以我可以做什麼,如果我想要命令它並區分? – user11001

+0

@ user11001 - 現在檢查更新 –

0

也許可以幫到你THIS LINK

如果你想使用順序和不同的用途通過...分組。

1

根據您的要求,您不需要DISTINCT,您只需顯示不存在具有相同QID的新行的行;

SELECT * FROM answer 
WHERE NOT EXISTS (
    SELECT 1 FROM answer a 
    WHERE answer.qid = a.qid 
    AND answer.time < a.time 
) 

An SQLfiddle to test with