雖然我已經為我正在尋找的東西提出了幾個可行的解決方案,但我想知道是否有一種更簡化的方法來確定單行中的 3 列中的哪一列包含最小/最小值。以下是我正在使用的資料示例:
| 帳號 | 作業 | 自上次銷售以來的天數 | 距離上次充電天數 | 成立以來的天數 |
|---|---|---|---|---|
| YO502 | 空值 | 空值 | 5283 | 空值 |
| YO525 | 空值 | 2303 | 2303 | 5917 |
| ZE100 | 1 | 190 | 449 | 707 |
| ZE100 | 2 | 160 | 279 | 615 |
| ZI402 | 空值 | 2109 | 2109 | 空值 |
結果會是什么,這只是 DaysInactive 的新列,其中包含 3 個非空 DaysSincexxx 值中的較小者:
| 帳號 | 作業 | 自上次銷售以來的天數 | 距離上次充電天數 | 成立以來的天數 | 不活動天數 |
|---|---|---|---|---|---|
| YO502 | 空值 | 空值 | 5283 | 空值 | 5283 |
| YO525 | 空值 | 2303 | 2303 | 5917 | 2303 |
| ZE100 | 1 | 190 | 449 | 707 | 190 |
| ZE100 | 2 | 160 | 279 | 615 | 160 |
| ZI402 | 空值 | 2109 | 2109 | 空值 | 2109 |
這就是我所擁有的,它只是使用一系列 CASE 運算式來比較它們。目標是根據與作業相關的 3 個不同日期值中的任何一個,找到客戶作業的最低閑置天數。需要明確的是,其中 2 列(DaysSinceLastSale 和 DaysSinceLastCharge)是主要目標,第 3 列(DaysSinceEstablished)是在前 2 列為 NULL 的情況下的最后手段(所有 3 列實際上都可以為 NULL,在這種情況下我們默認為 99999)。我最終在 PowerBI 報告中使用它,因此可以為最終用戶設定 >= 切片器,以手動輸入記錄應具有的最小非活動天數,以便在報告視覺物件上回傳:
SELECT
CASE
WHEN COALESCE(DaysSinceLastSale, DaysSinceLastCharge) IS NOT NULL THEN
CASE WHEN COALESCE(DaysSinceLastSale, DaysSinceLastCharge) <= COALESCE(DaysSinceLastCharge, DaysSinceLastSale)
THEN COALESCE(DaysSinceLastSale, DaysSinceLastCharge)
ELSE COALESCE(DaysSinceLastCharge, DaysSinceLastSale)
END
ELSE COALESCE(DaysSinceEstablished, 99999)
END as DaysInactive
, DS.*
FROM #DS2 DS
這是我最初的解決方案,但我只是不喜歡擁有所有子查詢和 UNION:
SELECT
NormalizedDaysInactive.DaysInactive
, DS.*
FROM #DS2 DS
JOIN (
SELECT
AccountNumber, BillingLevel, Job, MIN(ISNULL(DaysInactive, 99999)) as DaysInactive
FROM
(
SELECT AccountNumber, BillingLevel, Job, MIN(DaysSinceLastSale) as DaysInactive FROM #DS2 GROUP BY AccountNumber, BillingLevel, Job
UNION ALL
SELECT AccountNumber, BillingLevel, Job, MIN(DaysSinceLastCharge) as DaysInactive FROM #DS2 GROUP BY AccountNumber, BillingLevel, Job
UNION ALL
SELECT AccountNumber, BillingLevel, Job, MIN(DaysSinceEstablished) as DaysInactive FROM #DS2 GROUP BY AccountNumber, BillingLevel, Job
) ActDays
GROUP BY AccountNumber, BillingLevel, Job
HAVING MIN(ISNULL(DaysInactive, 1)) > 0
) NormalizedDaysInactive ON NormalizedDaysInactive.AccountNumber = DS.AccountNumber
AND (NormalizedDaysInactive.Job = DS.Job OR NormalizedDaysInactive.BillingLevel = 'Account')
感謝任何建議!謝謝
uj5u.com熱心網友回復:
您可以使用 APPLY 進行一些“行內”反透視操作,然后獲取最小值。我添加了該列TypeOfActivity,因為它也可以方便地了解哪些活動
多列之間的最小值
SELECT *
FROM YourTable AS A
CROSS APPLY (
SELECT TOP(1) *
FROM (
VALUES
('Sale',DaysSinceLastSale)
,('Charge',DaysSinceLastCharge)
,('Established',DaysSinceEstablished)
) AS DTA(TypeOfActivity,DaysSinceActivity)
WHERE DaysSinceActivity IS NOT NULL
ORDER BY DaysSinceActivity
) AS B
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/448926.html
