0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

並列データ ウェアハウス (PDW) 機能が有効になっていないサーバー上のデータを累積計算する

Posted at

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?