2015-10-17 42 views
0

我有表有一些數據,例如充分利用表中的所有字段由MAX(列1)過濾

ID Specified TIN Value 
---------------------- 
1  0 tin1 45 
2  1 tin1 34 
3  0 tin2 23 
4  3 tin2 47 
5  3 tin2 12 

我需要MAX獲得與各界行(指定)列。如果我有幾行用MAX列(例如在ID 4和5)我必須做最後一(ID爲5) 最終結果必然是

ID Specified TIN Value 
-----------------------  
2  1 tin1 34 
5  3 tin2 12 
+0

如果您正在使用最後一個ID(5),那麼爲什麼您的結果包含ID = 2的記錄? – Utsav

+0

對不起,我沒有寫入其他信息。我需要獲取由TIN列 –

+0

組成的MAX(指定)列的所有字段的行。您使用哪種rdbms? –

回答

0

這將給期望的結果使用窗函數:

;with cte as(select *, row_number(partition by tin order by specified desc, id desc) as rn 
      from tablename) 
select * from cte where rn = 1 
+0

好的代碼。但是如果我有ID = 6的行指定= 0 TIN = tin3值= 18 - 這行應該參與最終輸出! –

+0

@NursultanAidarkulov,看編輯... –

+0

非常感謝!代碼正常工作!要接受答案,我幾乎沒有聲望,但爲了將來我會保存你的名字)))。你真的幫了我 –

0

編輯:問題編輯後更新的查詢。 這裏是小提琴

http://sqlfiddle.com/#!9/20e1b/1/0

SELECT * FROM TBL WHERE ID IN (
SELECT max(id) FROM 
TBL WHERE SPECIFIED IN 
    (SELECT MAX(SPECIFIED) FROM TBL 
    GROUP BY TIN) 
group by specified) 

我相信我們可以進一步簡化它,但是這會奏效。

select * from tbl where id =(
SELECT MAX(ID) FROM 
tbl where specified =(SELECT MAX(SPECIFIED) FROM tbl)) 
+0

我用附加信息編輯了問題。抱歉,編輯後您的代碼無法正常工作。我需要獲取由TIN列 –

+0

現在檢查的MAX(指定)列所有字段的行。如果有效,請點擊問題左側的勾號,接受答案。 – Utsav

+0

否 - 如果我們有n行n個不同的指令,此代碼只取n行指定值 –

0

一種方法是使用窗口功能,row_number()

select t.* 
from (select t.*, row_number() over (partition by tim 
            order by specified desc, id desc 
            ) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

但是,如果你有一個指數tin, specified idid,最有效的方法是:

select t.* 
from t 
where t.id = (select top 1 t2.id 
       from t t2 
       where t2.tin = t.tin 
       order by t2.specified desc, id desc 
      ); 

這個更好的原因是索引將用於子查詢。然後該索引也將用於外部查詢。這非常有效。儘管索引將用於窗口函數,生成的執行計劃可能需要掃描整個表。

+0

對不起,但是這段代碼只帶了ID 4和5(( –

+0

@NursultanAidarkulov ...)。我想我誤解了這個問題(而且我不是唯一的問題)。你似乎希望你的條件符合'錫'。 –