2012-06-14 17 views
1

我一直在試圖低估寫一個MS SQL 2005查詢其幾乎做以下的最佳方式......SQL - 獨特的一欄,選擇多個其他?

select distinct col1, col2, col3 
from table1 

基本上,我想執行在col1不同的,但我不想對col2的Dististinc/3,我只是想要價值。

我明白它不可能這樣寫查詢,因爲我認爲我讀的Distinct應用於行而不是col?

任何人都可以請指點我正確的方向嗎?我曾嘗試右joing值回但我必須指定額外這種沒有工作在不同的選擇加入的cols這反過來執行這些鮮明的,即

select distinct t1.col1, t2.col2, t3.col3 
from table1 t1 
right join (select col1, col2, col3 from table1) t2 
on t1.col1 = t2.col1 

編輯,以更好地解釋..

select distinct t1.Hostname, t2.IP, t2.ActionDateTime, t2.Action 
from tblUserActions t1 
right join (select Hostname, IP, ActionDateTime from tblUserActions) t2 
on t1.Hostname = t2.Hostname 

基本上,這表是成千上萬的用戶操作和IM試圖名單上的主機名不同的列表,所以我應該只接收比如10行的那許多不同的主機名有怎麼樣了。然後根據這些主機名我想也加入了最新的記錄數據返回的行,所以我想回:

Hostname, IP, ActionDateTime, Action 
1 Host1, 165.123.123.1, 2012-06-14 02:07:08, Logon 
2 Host2, 165.123.123.2, 2012-06-14 03:07:08, Logoff 
3 Host3, 165.123.123.3, 2012-06-14 04:07:08, Logon 
4 Host4, 165.123.123.4, 2012-06-14 05:07:08, Logoff 
etc... 

任何幫助/指針將是巨大的!乾杯。

+2

如果我的理解是正確的,你只需要選擇從COL1的不同的值,但是你想要的一切,從COL2和COL3?當col1具有相同的值時,您想在其位置顯示什麼?你必須有一些值(即使它是空的)在col1上顯示在結果集上。 – Lex

+6

你能告訴我們一些樣品數據嗎?我不確定我完全理解你在 –

+4

之後,這是不可能的。在紙上試試 - 爲col1寫一個相同值的列,在它旁邊寫一個col2值不同的列。你會選擇哪種col2值?如果你想要所有這些,你不能只採用col1中的一個。你需要做什麼? –

回答

1

通過它我覺得這聲音是你所追求的:

WITH CTE AS 
( SELECT HostName, 
      IP, 
      ActionDate, 
      Action, 
      ROW_NUMBER() OVER(PARTITION BY HostName ORDER BY ActionDate DESC) AS RowNumber 
    FROM Table 
) 
SELECT HostName, 
     IP, 
     ActionDate, 
     Action 
FROM CTE 
WHERE RowNumber = 1 

這將爲主機名返回唯一的值,然後返回的值的其他各列基於該ORDER BY條款ROW_NUMBER()窗口功能。

您可能需要更改ORDER BY以符合您的確切要求,我認爲最可能的最新動作可能是最可能的。

+0

這工作完美,感謝您的幫助! – Developr

1

你只是想爲每個主機名/ IP的最新動作?

你可以做這樣的事情:

with latestAction as (
select hostname, 
     ip, 
     max(ActionDate) as latestActionDate 
from tblUserActions 
group by hostname, 
     ip) 
select la.hostName, 
    la.ip, 
    tua.ActionDate, 
    tua.Action 
from tblUserActions tua join latestAction la on 
     tua.hostname = la.hostname and 
     tua.ip = la.ip and 
     tua.ActionDate = la.latestActionDate 
+0

這個接近工作也 - 謝謝! – Developr