2012-06-27 99 views
0

我想構建一個查詢,它給了我基於列的唯一記錄。這個簡化的數據的樣品:SQL查詢的唯一記錄

version  first   last 
a    joe    smith 
b    jane    smith 
c    biff    mcelroy 
a    thad    dussledorf 

我想查詢返回基於所述version獨特記錄(所以在這種情況下1的a,b的情況下,和c)。對於這些返回的行,應該表示所有3列。所以理想的結果將是:

version  first   last 
a    joe    smith 
b    jane    smith 
c    biff    mcelroy 
+3

堆表沒有「行順序」的概念。你的表是否有時間戳或用來選擇合適的版本「a」? –

+0

你能告訴我們你到目前爲止所嘗試過的嗎? – Lex

+1

這是用於SQL-Server的嗎?還是Postgres?還是訪問?還是火鳥?或者SQLite?要麼 ...? –

回答

0

我不知道這是否會具有任何錯誤/問題:

select distinct version, 
(select top 1 [first] from tableName t1 where t1.version = t.version) as [first], 
(select top 1 [last] from tableName t1 where t1.version = t.version) as [last] 
from tableName t 

你可以「由XXX令」有某種每個子查詢。

我不確定2個子查詢總是會帶回相同的「最高」記錄......?

但這並不理想。你最好有一個記錄ID或時間戳或一些工作,然後你會使用一個不同的解決方案。

1

假設你的數據庫支持窗口功能,做到這一點的最好辦法是:

select t.* 
from (select t.*, row_number() over (partition by version order by version) as seqnum 
     from t 
    ) t 
where seqnum = 1 

此選擇任意「第一」行一個版本。

0

如果你沒有打擾哪些獨特的版本應該多者中返回,你可以簡單地使用GROUP BY:

select version, first_name, last_name from table name group by version; 
0

的回答你的問題取決於數據庫。如果您使用的是Oracle(pl/sql),那麼您可以使用排序功能:

SELECT * FROM (SELECT版本,第一個,最後一個RANK()OVER(PARTITION BY ORDER BY優先)RANK FROM SomeTable) WHERE RANK = 1;

複製並粘貼此查詢可能無效。所以請閱讀http://www.techonthenet.com/oracle/functions/rank.php以瞭解需要完成的工作。