2011-10-26 6 views
3

私は何をしようとしているのかに合ったシナリオを見つけることができませんでした。SQLは、別のテーブルからの最新のデータを含む1つのテーブルを更新します - 条件付き

私は、UserID、Subscription PackageID、およびSubscription日付を保持する1つのテーブルを持っています。ユーザーID 14525398のための#Subscriptionため

サンプルデータ:

上記の例で
UserID  Package  Date 
14525398 188535  2011-05-17 00:00:00.000 
14525398 188535  2011-06-16 00:00:00.000 
14525398 188536  2011-06-23 00:00:00.000 

は、6月16日に、この人は、彼らが別で188536.

をのPackageIDにアップグレード6月23日のPackageID 188535.に加入しますテーブル私は自分のダウンロード履歴を持っていますが、私がしようとしているのは、ダウンロードした日に購読していたPackageIDを派生させたものです。このダウンロードテーブルには、UserID、ダウンロード数、ダウンロード日付、および更新が必要な価値のないPackageIDがあります。

#Download表のサンプルデータがある:

上記の例を使用
UserID  Dloads Date    PackageID 
14525398 3  2011-06-18 00:00:00.000  0 
14525398 2  2011-06-18 00:00:00.000  0 
14525398 2  2011-06-19 00:00:00.000  0 
14525398 5  2011-06-24 00:00:00.000  0 
14525398 2  2011-06-18 00:00:00.000  0 

、私は正確にそれが最新だったので、4番目のレコード(5件のダウンロードレコードが)のPackageID 188536にあったことを示してクエリーを必要としますしかし、この

UPDATE #Download SET PackageID = (
SELECT TOP 1 PackageID 
FROM #subscription 
WHERE userID = #Download.userID AND Date <= #Download.Date 
) 

:パッケージ休憩しながら、2011年6月24日のダウンロード日より前には、私はそうのように更新しようとした

のPackageID 188535.になります前述のように、2011-06-24のダウンロードはPackageID 188536に設定されています。

ご協力いただければ幸いです。 SQL Server 2008の

答えて

4
UPDATE #Download SET PackageID = (
    SELECT TOP 1 PackageID 
    FROM #subscription 
    WHERE userID = #Download.userID AND Date <= #Download.Date 
    order by Date desc 
) 

私はそれが動作するはずだと思う...

+0

ああ、本当にありがとうございます、それはその日の順序を逃すほど簡単だったと信じています。それは有り難いです! – Mike250

+0

@ Mike250 plzは、問題を解決した場合には、答えをマークするのを忘れないでください。 – Zohaib

+0

私の謝罪。私は答えを受け入れてマークしました。ありがとうございました。 – Mike250

0

正しいサブスクリプションを選択する必要があるので、あなたは比較に最も近いサブスクリプションの日付を選択するように、私は、where句にDateDiff関数を追加しましたダウンロード日に

UPDATE #Download SET PackageID = (
    SELECT TOP 1 PackageID 
    FROM #subscription 
    WHERE userID = #Download.userID 
    AND datediff(Date,#Download.Date) > 1 
    orderby datediff(Date,#Download.Date) 
) 
+0

あなたのスクリプトに 'datediff'にはいくつかの問題があります:1)それはクエリを非sargableにレンダリングします、2)最新のパッケージが'#Download.Date'の1日前にあった場合、 'PackageID'を間違って割り当てます。 '> 1'の代わりに'> 0')、そして3)構文が間違っています:最初のものがユニット名(この場合は 'day')である2つではなく3つの引数が必要です。 –

関連する問題