SQL Server 2008ではPDWが無効
以下のような売り上げテーブルがあるとします。
CREATE TABLE Sales (
SaleDate DATE,
ProductName VARCHAR(50),
Revenue INT
);
INSERT INTO Sales (SaleDate, ProductName, Revenue)
VALUES
('2023-07-14', 'Apple', 1000),
('2023-07-15', 'Banana', 1500),
('2023-07-16', 'Orange', 2000),
('2023-07-17', 'Apple', 1200),
('2023-07-18', 'Banana', 1800),
('2023-07-19', 'Orange', 2200),
('2023-07-20', 'Apple', 900),
('2023-07-21', 'Banana', 1400),
('2023-07-22', 'Orange', 1800),
('2023-07-23', 'Apple', 1100),
('2023-07-24', 'Banana', 1600),
('2023-07-25', 'Orange', 1900),
('2023-07-26', 'Apple', 950),
('2023-07-27', 'Banana', 1300),
('2023-07-28', 'Orange', 1700);
SaleDate | ProductName | Revenue |
---|---|---|
2023-07-14 | Apple | 1000 |
2023-07-15 | Banana | 1500 |
2023-07-16 | Orange | 2000 |
2023-07-17 | Apple | 1200 |
2023-07-18 | Banana | 1800 |
2023-07-19 | Orange | 2200 |
2023-07-20 | Apple | 900 |
2023-07-21 | Banana | 1400 |
2023-07-22 | Orange | 1800 |
2023-07-23 | Apple | 1100 |
2023-07-24 | Banana | 1600 |
2023-07-25 | Orange | 1900 |
2023-07-26 | Apple | 950 |
2023-07-27 | Banana | 1300 |
2023-07-28 | Orange | 1700 |
Microsoft SQL Server 2012以前のバージョンではデフォルトで並列データ ウェアハウス (PDW) 機能が無効です。
そのため、以下のようなSUM() OVER(PARTITION BY **)
句によって品目ごとの売上累計を算出しようとするとエラーが発生します。
SELECT
SaleDate,
ProductName,
Revenue,
SUM(Revenue) OVER(PARTITION BY ProductName ORDER BY SaleDate) AS [Accumulated]
FROM
Sales
ORDER BY
SaleDate
並列データ ウェアハウス (PDW) 機能が有効になっていません。
リンクサーバー設定
データ サーバーのバージョンアップ対応が取れない場合、PDWが有効なバージョンのサーバーからリンクサーバー設定することで、
新バージョンのサーバーから旧バージョンのデータに対しPDW機能を使ったクエリが実行可能になります。
SELECT
SaleDate,
ProductName,
Revenue,
SUM(Revenue) OVER(PARTITION BY ProductName ORDER BY SaleDate) AS [Accumulated]
FROM
[リンクサーバー名].[スキーマ名].Sales
ORDER BY
SaleDate
SaleDate | ProductName | Revenue | Accumulated |
---|---|---|---|
2023-07-14 | Apple | 1000 | 1000 |
2023-07-15 | Banana | 1500 | 1500 |
2023-07-16 | Orange | 2000 | 2000 |
2023-07-17 | Apple | 1200 | 2200 |
2023-07-18 | Banana | 1800 | 3300 |
2023-07-19 | Orange | 2200 | 4200 |
2023-07-20 | Apple | 900 | 3100 |
2023-07-21 | Banana | 1400 | 4700 |
2023-07-22 | Orange | 1800 | 6000 |
2023-07-23 | Apple | 1100 | 4200 |
2023-07-24 | Banana | 1600 | 6300 |
2023-07-25 | Orange | 1900 | 7900 |
2023-07-26 | Apple | 950 | 5150 |
2023-07-27 | Banana | 1300 | 7600 |
2023-07-28 | Orange | 1700 | 9600 |
もちろん累積計算自体はPDW機能を使わなくても可能です
(Salesテーブル(別名:S1)に同じSalesテーブル(別名:S2)を「S1のSaleDateがS2以上でProductNameが同じ」という条件で結合する 等)。
SELECT
S1.SaleDate,
S1.ProductName,
S1.Revenue,
SUM(S2.Revenue) AS [Accumulated]
FROM
Sales S1
INNER JOIN Sales S2 ON S1.SaleDate >= S2.SaleDate AND S1.ProductName = S2.ProductName
GROUP BY
S1.SaleDate,
S1.ProductName,
S1.Revenue
ORDER BY
SaleDate