2009-07-06 20 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 

は2 mrtk(0005)がある見ることができ、これらの結果から、それはわずか3を返す必要があります4行の代わりに

mrtkの代わりにmrtkだけのクエリはありません。mrtitleがある場合は、倍数があるときに最新の日付を見つける必要があります。

私は次のクエリを試しました。最も古いものから順にソートされた結果を返しますが、3つではなく4つの行(2つの0005)を返します。私は同じクエリを行うさまざまな方法を試しましたが、すべて同じ結果を返します。

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

提供可能なすべての支援をいただければ幸いです。

更新: mrrate列にはNULLを含めることができ、NULLには最新のエントリを使用できます。私が後にしているのは、同じmrmatter AND(mrtk OR 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のようなものを掲示するときにはコードブロックを使うべきですので、強調表示されます。 –

答えて

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)の2つの行について、最初の行は250としてmrrateを持ち、2番目の行はNULLとしてmrrateを持っています。これは確かに0005の2行になります。

クエリは正常に動作しています。あなたは団塊から団塊を取り除いても良いかもしれませんが、おそらくそこにはっきりしていない機能がいくつかあります。

+0

グループからのmrrateカラムの削除結果: カラム 'mexrate.mrrate'は、集計関数またはGROUP BY句に含まれていないため、選択リストでは無効です。 – Lima

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) 

EDIT
を私は再びあなたの質問を読んで、私はおそらく、あなたのグループ化の要件のために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 

あなたがグループにmrrateを入れしようとしている、と0005の2つ持っているので、それはあなたのクエリと同じ4行が得られます: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結果がmrmatter AND(mrtitle OR mrtk)の最新の結果であるかのようにNULL結果を除外したくない場合は、それを表示します。 おかげで、 マット – Lima

+0

http://www.google.com/search?hl=en&as_q=sql+server+2000+row_number&as_epq=&as_oq=&as_eq=&num=100&lr=&as_filetype=&ft=i&as_sitesearch=&as_qdr=all&as_rights =&as_occt = any&cr =&as_nlo =&as_nhi =&safe = images –

関連する問題