4

SQL の場合、row_number の最大値の計算に問題があります。

理解しやすいと思うので、SQL Fiddle の例で直接説明します。SQL Fiddle

  • 列「OrderNumber」、「HourMinute」、および「Code」は単にテーブルを表すためのものであるため、コーディング目的には関係ありません
  • 列「DateOnly」には日付が含まれています
  • 列「電話」には顧客の電話が含まれています
  • 列「購入」には、顧客が過去 12 か月に購入した回数が含まれています。この値は日付ごとに提供されるため、12 か月の期間は評価対象の日付に相対的であることに注意してください。

最後に、私が作成しようとしている列は、'Purchases' 列に表示された数字が過去 12 か月間 (電話ごと) に表示された回数をカウントする 'PREVIOUSPURCHASES' です。

SQL Fiddle の例で、私がこれまでに達成したことを確認できます。列「PREVIOUSPURCHASES」は、私が望むものを生成していますが、より低い値も生成しています (たとえば、最大のものだけが必要です)。

たとえば、行 4 と 5 が重複していることがわかります。1 つは 'PREVIOUSPURCHASES' が 1 で、もう 1 つは 2 です。この場合、4 行目は必要ありません。

row_number を max(row_number) のようなものに置き換えることについては考えましたが、それを生成できませんでした (stackoverflow で同様の投稿を既に見ました...)。

これは、SQL Server 2012 で実装する必要があります。

前もって感謝します。

4

1 に答える 1

1

あなたが見たい結果セットの種類がわかりませんが、これで返されるものに何か問題はありますか?

SELECT c.OrderNumber, c.DateOnly, c.HourMinute, c.Code, c.Phone, c.Purchases, MAX(o.PreviousPurchases)
FROM cte c CROSS APPLY (
                      SELECT t2.DateOnly, t2.Phone,t2.ordernumber, t2.Purchases, ROW_NUMBER() OVER(PARTITION BY c.DateOnly ORDER BY t2.DateOnly) AS PreviousPurchases
                      FROM CurrentCustomers_v2 t2
                      WHERE c.Phone = t2.Phone AND t2.purchases<=c.purchases AND DATEDIFF(DAY, t2.DateOnly, c.DateOnly) BETWEEN 0 AND 365
                      ) o
WHERE c.OrderNumber = o.OrderNumber
GROUP BY c.OrderNumber, c.DateOnly, c.HourMinute, c.Code, c.Phone, c.Purchases
ORDER BY c.DateOnly
于 2013-04-10T17:58:35.497 に答える