2014-12-03 41 views
1

我需要在三個條件任何其他替代寫這個SQL查詢

  1. 選擇數據庫查找表的最後日期(StorageDate列)爲每個記錄
  2. 看看是否有更多的則是一個在爲相同的ID第一步(ID列)
  3. 然後查看找到的條目的日期(StorageDate column)如果DuplicateID是= 2

因此,如果表具有如下的數據:

ID |StorageDate | DuplicateTypeID 
1 |2014-10-22 | 1 
1 |2014-10-22 | 2 
1 |2014-10-18 | 1 
2 |2014-10-12 | 1 
3 |2014-10-11 | 1 
4 |2014-09-02 | 1 
4 |2014-09-02 | 2 

然後,我應該得到以下結果

ID 
1 
4 

我已經寫了下面的查詢,但它實在是太慢了,我想知道是否有人有更好的方式來寫。

SELECT DISTINCT(TD.RecordID) 
FROM dbo.MyTable TD 
JOIN (
    SELECT T1.RecordID, T2.MaxDate,COUNT(*) AS RecordCount 
    FROM MyTable T1 WITH (nolock) 
    JOIN (
    SELECT RecordID, MAX(StorageDate) AS MaxDate 
      FROM MyTable WITH (nolock) 
      GROUP BY RecordID)T2 
    ON T1.RecordID = T2.RecordID AND T1.StorageDate = T2.MaxDate 
    GROUP BY T1.RecordID, T2.MaxDate 
    HAVING COUNT(*) > 1 
    )PT ON TD.RecordID = PT.RecordID AND TD.StorageDate = PT.MaxDate 
    WHERE TD.DuplicateTypeID = 2 
+0

會不會有一種情況,一個ID爲duplicatetype 2,但*犯規*顯示在列表中的? – paqogomez 2014-12-03 21:57:55

回答

0

您可以使用分析功能rank,你可以試試這個查詢嗎?

Select recordId from 
(
    select *, rank() over (partition by recordId order by [StorageDate] desc) as rn 
    from mytable 
) T 
where rn =1 
group by recordId 
having count(*) >1 
and sum(case when duplicatetypeid =2 then 1 else 0 end) >=1 
0

試試這個,看看性能如何去:

;WITH 
    tmp AS 
    (
     SELECT  *, 
        RANK() OVER (PARTITION BY ID ORDER BY StorageDate DESC) AS StorageDateRank, 
        COUNT(ID) OVER (PARTITION BY ID, StorageDate) AS StorageDateCount 
     FROM  MyTable 
    ) 

SELECT DISTINCT ID 
FROM tmp 
WHERE StorageDateRank = 1 -- latest date for each ID 
    AND StorageDateCount > 1 -- more than 1 entry for date 
    AND DuplicateTypeID = 2 -- DuplicateTypeID = 2