2016-02-27 88 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