2009-07-06 284 views
1

我想寫一個查詢,將只返回最新的結果。我從中提取信息的表沒有唯一列,並且包含有關費率變化的信息,因此對於任何特定的客戶端,可能存在多個費率變化 - 我只希望每個客戶端的最新費率變化。選擇最近的日期

結構爲:

mrmatter VARCHAR(14) 
mrtk VARCHAR(14) 
mreffdate DATETIME 
mrtitle VARCHAR(100) 
mrrate INT 
mrdevper INT 

一些樣本數據:

mrmatter   mrtk  mreffdate     mrtitle mrrate mrdevper 
184-00111  0005  2001-03-19 00:00:00.000 !  250  NULL 
184-00111  0259  2001-03-19 00:00:00.000 !  220  NULL 
184-00111  9210  2001-03-19 00:00:00.000 !  220  NULL 
184-00111  0005  2007-07-01 00:00:00.000 !  NULL  NULL 

從以上數據可以看到在兩個mrtk(0005),從這些結果應該只返回三個而不是四行。

查詢不只是在mrtk,而不是mrtk可能有一個mrtitle在這種情況下,我需要找到最近的日期,當有多個。

我已經嘗試過下面的查詢,它返回的結果排序在最新到最舊,但它返回四行(兩個0005),而不是隻有三個。我已經嘗試了不同的方式來做同樣的查詢,但它都返回相同的結果。

SELECT mrmatter,mrtk,mrrate,MAX(mreffdate) AS 'MostRecent' 
FROM mexrate 
WHERE mrmatter='184866-00111' 
GROUP BY mrmatter,mrtk,mrrate 

任何可以提供的援助將不勝感激。

更新: mrrate列可以包含空值,並且空值可以是最新的條目。我所追求的是同一個mrmatter AND(mrtk或mrtitle)的最新條目。

一些更樣本數據是:

mrmatter  mrtk    mrtk  mrrate mreffdate 
100626-01406 Senior Assoc ! 235.000 2006-01-25 00:00:00.000 
100626-01406 Solicitor ! 235.000 2006-01-25 00:00:00.000 
100626-01407 Associate   ! 265.000 2006-01-30 00:00:00.000 
100626-01407 Associate   ! 276.000 2007-07-01 00:00:00.000 
100626-01407 Partner   ! 265.000 2006-01-30 00:00:00.000 
100626-01407 Partner   ! 276.000 2007-07-01 00:00:00.000 
100626-01407 Senior Assoc ! 265.000 2006-01-30 00:00:00.000 
100626-01407 Senior Assoc ! 276.000 2007-07-01 00:00:00.000 

馬特

+0

您能否提供一個CREATE TABLE和INSERT語句。這會容易得多。在發佈像SQL這樣的東西時,您應該使用代碼塊,以便突出顯示。 – 2009-07-06 08:33:07

回答

1

我能達到什麼樣的我後,使用此查詢:

SELECT t1.mrmatter,t2.mrtk,t1.mrrate,t2.MostRecent 
FROM mexrate t1 
INNER JOIN 
(
    SELECT DISTINCT(mrtk),MAX(mreffdate) AS MostRecent 
    FROM mexrate 
    WHERE mrmatter='184866-00111'  
    GROUP BY mrtk 
) t2 ON t1.mrtk=t2.mrtk AND t1.mreffdate=t2.MostRecent 
WHERE mrmatter='184866-00111' 

謝謝大家對這個問題你的幫助,這是一如既往, 不勝感激。

馬特

2

group by子句具有mrrate列,以及。對於mrtk(0005)的兩行,第一行的mrrate爲250,第二行的mrrate爲NULL。這肯定會導致兩行0005.

該查詢工作正常。您可以從組中刪除mrrate,但可能會附加一些不明確的功能。

+0

根據結果從組中刪除mrrate列: 列'mexrate.mrrate'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – Lima 2009-07-08 01:04:22

0

試試這個:

DECLARE @YourTable table 
(mrmatter VARCHAR(14) 
,mrtk VARCHAR(14) 
,mreffdate DATETIME 
,mrtitle VARCHAR(100) 
,mrrate INT 
,mrdevper INT 
) 

insert into @YourTable values('184-00111',  '0005'  , '2001-03-19 00:00:00.000' , '!' , 250 , NULL) 
insert into @YourTable values('184-00111',  '0259'  , '2001-03-19 00:00:00.000' , '!' , 220 , NULL) 
insert into @YourTable values('184-00111',  '9210'  , '2001-03-19 00:00:00.000' , '!' , 220 , NULL) 
insert into @YourTable values('184-00111',  '0005'  , '2007-07-01 00:00:00.000' , '!' , NULL , NULL) 

SELECT 
    mrmatter 
     ,mrtk 
     ,mreffdate 
     ,mrtitle 
     ,mrrate 
     ,mrdevper 
    FROM (SELECT 
       row_number() over(partition by mrtk order by mrtk,mreffdate DESC) AS RankValue,* 
       FROM @YourTable 
     ) dt 
    WHERE RankValue=1 

輸出:

mrmatter  mrtk   mreffdate    mrtitle mrrate  mrdevper 
-------------- -------------- ----------------------- -------- ----------- ----------- 
184-00111  0005   2007-07-01 00:00:00.000 !  NULL  NULL 
184-00111  0259   2001-03-19 00:00:00.000 !  220   NULL 
184-00111  9210   2001-03-19 00:00:00.000 !  220   NULL 

(3 row(s) affected) 

編輯
我又看了你的問題,我不是100%確定爲您的分組要求,也許因爲樣本數據有點稀疏。這可能是查詢您:

SELECT 
    mrmatter 
     ,mrtk 
     ,mreffdate 
     ,mrtitle 
     ,mrrate 
     ,mrdevper 
    FROM (SELECT 
       row_number() over(partition by mrmatter,mrtk,mrrate order by mrmatter,mrtk,mrrate,mreffdate DESC) AS RankValue,* 
       FROM @YourTable 
     ) dt 
    WHERE RankValue=1 

它會產生相同的4行的查詢,因爲你正試圖把mrrate成團,和0005二:250和NULL。如果你想消除NULL使用:

SELECT 
    mrmatter 
     ,mrtk 
     ,mreffdate 
     ,mrtitle 
     ,mrrate 
     ,mrdevper 
    FROM (SELECT 
       row_number() over(partition by mrmatter,mrtk,mrrate order by mrmatter,mrtk,mrrate,mreffdate DESC) AS RankValue,* 
       FROM @YourTable 
       WHERE mrrate IS NOT NULL 
     ) dt 
    WHERE RankValue=1 
+0

首先,row_number用於SQL 2000,所以這些都不起作用。我也不想排除NULL結果,就好像NULL結果是mrmatter AND(mrtitle或mrtk)的最新結果,然後我希望它顯示。 謝謝, 馬特 – Lima 2009-07-08 01:34:43