適用対象:✅ Warehouse in Microsoft Fabric
テーブルを作成しデータを読み込んだ後、報告や下流処理に使う前に、データの完全性と正確性を検証してください。
この記事では、ウェアハウス内のCreate tablesで作成したdbo.fact_saleテーブルに対して実行できる、検証やクリーンアップクエリのシンプルで現実的な例を提供します。
Prerequisites
開始するには、次の前提条件を満たす必要があります。
-
Premium 容量 ワークスペースで共同作成者以上のアクセス許可を持つ場合、Warehouse アイテムにアクセスすることができます。
- 必ず倉庫アイテムに接続してください。 ウェアハウスのSQL分析エンドポイントで直接クエリを実行することはできません。
- クエリ ツールを選択します。 このチュートリアルでは、Microsoft Fabric ポータルで SQL クエリ エディター を使用しますが、任意の T-SQL クエリ ツールを使用できます。
- 「倉庫でテーブルを作成」に示したように、データで埋められた
dbo.fact_saleテーブルを用意してください。
検証クエリは非常に単純な述語(例えば NULL 値のチェック)から、組み込みの AI機能 を使ってデータの意味や品質を評価するより高度なチェックまで多岐にわたります。 チェックするデータのリスクや重要度に見合った検証レベルを選びましょう。
これらのクエリで返された行は、自動エラーではなく、レビュー候補として扱いましょう。 行を修正または削除する前に、データやソースシステムの所有者にビジネスルールを確認し、事実行を更新するよりもソースや変換の修正を優先してください。
列に値が欠けている行を見つける
必要な列に欠けている行を見つけるには、シンプルな WHERE 節を使いましょう。 このチェックは、データをテーブルに読み込んだ後に行われる最も速く、最も一般的なチェックの一つです。
SELECT SaleKey, CustomerKey, StockItemKey, Quantity, UnitPrice
FROM dbo.fact_sale
WHERE CustomerKey IS NULL
OR StockItemKey IS NULL
OR Quantity IS NULL
OR UnitPrice IS NULL;
計算の検証
保存された合計値をその期待値と比較し、取り込みや変換時に生じるデータ品質の問題を検出します。 例えば、 TotalIncludingTax は常に TotalExcludingTax プラス TaxAmountであるべきです。
NULLを含むSQL比較は決してtrueに評価されないため、欠落した量がないか明示的にチェックして、その行が静かに除外されないようにしましょう。
SELECT SaleKey, TotalExcludingTax, TaxAmount, TotalIncludingTax,
(TotalExcludingTax + TaxAmount) AS ExpectedTotalIncludingTax
FROM dbo.fact_sale
WHERE TotalExcludingTax IS NULL
OR TaxAmount IS NULL
OR TotalIncludingTax IS NULL
OR TotalIncludingTax <> (TotalExcludingTax + TaxAmount);
重複行を見つける
一緒に一意であるべきビジネス列の組み合わせを確認してください。 請求書モデルが請求書の在庫ごとに最大1行しか許さないなら、 WWIInvoiceID と StockItemKey の組み合わせは一意であるべきです。
SELECT WWIInvoiceID, StockItemKey, COUNT(*) AS NumberOfRows
FROM dbo.fact_sale
WHERE WWIInvoiceID IS NOT NULL
AND StockItemKey IS NOT NULL
GROUP BY WWIInvoiceID, StockItemKey
HAVING COUNT(*) > 1;
また、厳密なルールではなく、異なるビジネス欄の組み合わせを使って重複をチェックすることもできます。 同じ営業担当者が同じ商品を同じ日に同じ顧客に複数回販売することは珍しいので、 CustomerKey、 StockItemKey、 InvoiceDateKey、 SalespersonKey の組み合わせで複数行を用意するのは重複の可能性として確認する価値があります。 一致を確定として扱う前に、元システムと照合して確認してください。同じ日に正当な再注文が行われる可能性があるためです。
SELECT CustomerKey, StockItemKey, InvoiceDateKey, SalespersonKey, COUNT(*) AS NumberOfRows
FROM dbo.fact_sale
WHERE CustomerKey IS NOT NULL
AND StockItemKey IS NOT NULL
AND InvoiceDateKey IS NOT NULL
AND SalespersonKey IS NOT NULL
GROUP BY CustomerKey, StockItemKey, InvoiceDateKey, SalespersonKey
HAVING COUNT(*) > 1;
コンテンツの検証
値が期待される集合または範囲内にあるかを確認してください。 例えば、 Quantity と UnitPrice は常に正の数であるべきです。
SELECT SaleKey, Quantity, UnitPrice
FROM dbo.fact_sale
WHERE Quantity <= 0
OR UnitPrice <= 0;
AI機能でデータを検証する
単純な述語で表現しにくいチェックについては、 AI関数 を使って自然言語で列の内容を推論します。
dbo.fact_saleでは、Descriptionに商品が生鮮、冷凍、または冷蔵のいずれであるかがよく記載されているため、AI_GENERATE_RESPONSEを使って、その行のTotalDryItems数とTotalChillerItems数に一致しているかどうかを確認できます。 命令を @prompt 変数として一度定義し、行固有の値は別のデータ引数として渡します。
DECLARE @prompt nvarchar(max) = N'A product description that mentions frozen or chilled items should usually have a nonzero chiller item count, and a description that mentions only dry or ambient items should usually have a nonzero dry item count. Based on the description, dry item count, and chiller item count below, respond with OK if the values look consistent, or a short phrase describing what might be worth reviewing.';
DECLARE @InvoiceDate date = '2013-01-01';
SELECT SaleKey, Description, TotalDryItems, TotalChillerItems,
AI_GENERATE_RESPONSE(
@prompt,
CONCAT(
'Description: ', Description,
'. Dry item count: ', TotalDryItems,
'. Chiller item count: ', TotalChillerItems
)
) AS ReviewNote
FROM dbo.fact_sale
WHERE InvoiceDateKey = @InvoiceDate;
ソースデータを修正する前に、ソースシステムの所有者と不一致の可能性を確認しましょう。