1

ここでの私の前の質問に関連しています: 2つの後続の行のそれぞれの減算を挿入し、それを新しい列に挿入する方法

別の質問があります。次の表では、各ユーザーがコンテストで最後に優勝してから経過した時間を計算したいと考えています。実際、現在の日付から最後の当選日を差し引く必要があります。(place=1) は勝利を示します。

現在のテーブル:

http://www.8pic.ir/images/75206897877200828586.jpg

私が望む結果:

http://www.8pic.ir/images/78832309907063712878.jpg

この質問に対して次のクエリを書きました(以前の質問で得た回答に従ってここ)!しかし、問題は、多くの重複行が発生することです! 4000 行しかありませんが、このクエリを実行すると 40,000 行になります。何が問題ですか!助けてください。また、以前に勝ったことのないユーザーには負の値が表示されます。これらのフィールドを NULL にしたい。

;WITH [cte15853354] AS
 (
    SELECT 
        [user-name],
        [submissions],
        [date],
        [place],
        [recency],
        ROW_NUMBER() OVER (ORDER BY [user-name], [date] DESC) AS [ROWNUMBER]
    FROM dbo.[top-design1]
 )
SELECT 
    t.[user-name],
    t.[submissions],
    t.[date],
    t.[place],
    t.[recency],
    DATEDIFF(DAY, ISNULL(k.[date],t.[date]),t.[date]) AS [win-recency]
INTO dbo.[top-design2]
FROM [cte15853354] t
LEFT JOIN [cte15853354] k
    ON k.[user-name] = t.[user-name] 
     where k.[place]=1 
    ORDER BY t.[user-name], t.[date] DESC
4

1 に答える 1

1

これで終わりです (実際にはケース テストは必要ありません):

SELECT [user-name], 
       submissions,
       [date],
       place,
       recency,
       DATEDIFF(DAY, 
       (SELECT TOP(1) [date]
        FROM [top-design1] td1
        WHERE td1.[user-name] = [top-design1].[user-name]
        AND place = 1
        AND [date] < [top-design1].[date]
        ORDER BY [date] DESC), [date]) as recencywin
FROM [top-design1]

挿入目的で使用するには、自分で管理できると思います。

于 2013-04-09T08:33:41.707 に答える