2016-08-30 20 views
2

我正在使用MS SQL數據庫。我需要按照最大值選擇行,而不是重複。請嘗試下面的SQL QUERY按照最大值返回所選行,不使用MS SQL重複

但它給出了重複的值。

我需要評分值和CID根據MAX(FDateTime)。我怎樣才能達到這個結果?

我已經嘗試過內連接的概念,但我曾經遇到過這個概念上的一些錯誤。

+1

請將預期結果和樣本結果作爲文本發佈並解釋以及它 – TheGameiswar

+0

查詢應該返回單行還是FDateTime = max(FDateTime)的所有行? – Serg

回答

1

試試這個

SELECT CID ,Rate ,FDateTime 
    FROM (SELECT CID ,Rate ,FDateTime,RANK() OVER (PARTITION BY CID ORDER BY FDateTime DESC) rank 
     FROM FTable WHERE OId = 1413 and TYPE = 'C') AS T WHERE rank=1 
ORDER BY CID 
+0

它不會工作,仍然是給重複的值 –

+0

@NIKHILKA你可以附上截圖? –

+0

「106 \t \t 6 2016年5月12日16:15:06.340 \t 6 15 2016年7月28日:33:06.247 \t 6 20 2016年8月9日:37:33.643 2016-08-08 21:23:00.487 2016-05-18 12:50:35.210' –

0

使用row_number()

select ft.* 
from (Select ft.*, 
      row_number() over (partition by cid, rate order by fdatetime desc) as seqnum 
     from FTable ft 
     where ft.OId = 1413 and ft.type = 'C' 
    ) ft 
where seqnum = 1; 
0

對於您應該使用窗函數(如果你的SQL Server版本允許的話):

WITH TMP AS (
SELECT CId, Rate, ROW_NUMBER() OVER(PARTITION BY CId, Rate ORDER BY FDateTeim DESC) AS RNK 
FROM my_table 
WHERE ....) 
SELECT CId, Rate 
FROM TMP 
WHERE RNK = 1 

MSDN ROW_NUMBER()

+0

我已經試過這一個,但仍然獲得重複記錄 –

+0

我真的很感興趣,看到這一點。 row_number保證你在分區子句上的唯一性。所以對於這個問題,它不能返回一個重複的行。現在,如果你仍然認爲你有一些重複的記錄,然後張貼數據和數據出來的表結構需要 – Nemeros

0

您可以使用OUTER APPLY獲得MAX(FDateTime)特定OId[type]

;WITH FTable AS (
SELECT * 
FROM (VALUES 
(106, 6, '2016-05-12 16:15:06.340','C',1413), 
(109, 6, '2016-07-28 15:33:06.247','C',1413), 
(109, 6, '2016-08-09 20:37:33.643','C',1413), 
(111, 6, '2016-08-08 21:23:00.487','C',1413), 
(106, 7, '2016-05-18 12:50:35.210','C',1433) 
) as t(CId,Rate,FDateTime,[type],OId) 
) 


SELECT f.CId, 
     f.Rate, 
     f.FDateTime 
FROM FTable f 
OUTER APPLY (
    SELECT MAX(FDateTime) fdate 
    FROM FTable 
    WHERE OId = f.OID and [type] = f.[type] 
    ) as t 
WHERE f.OId = 1413 and f.[type] = 'C' and t.fdate=f.FDateTime 

輸出:

CId Rate FDateTime 
109 6  2016-08-09 20:37:33.643 
+0

是的,對不起,遲了答覆。但我得到了這個錯誤「聚合右側的一個APPLY無法引用左側的列。「 –

+0

你使用什麼版本的SQL Server?我用類似'(1,1,'2016-01-01,1413,'C')的樣本(CId,Rate,FDateTime,[type],OId)'等創建臨時表,並且所有日期都正常。 – gofr1

+0

我添加一些樣本數據並輸出 – gofr1

0
中OID = 1413和類型

所有MAX(FDateTime)率和CID = 'C'

select CId, 
     Rate, 
     FDateTime 
from FTable f 
where OId = 1413 and type = 'C' 
    and FDateTime = (select Max(f2.FDateTime) 
        from FTable f2    
        where f2.OId=f.Oid and f2.type = f.type) 
+0

它只返回一條記錄,我需要所有cid的最新FDateTime記錄 –