簡體   English   中英

獲取同一行上 3 列之間的最小值

[英]Get MIN value between 3 columns on same row

雖然我已經為我正在尋找的東西提出了幾個可行的解決方案,但我想知道是否有更簡化的方法來確定單行中的 3 列中的哪一列包含最小/最小值。 以下是我正在使用的數據示例:

賬號 工作 自上次銷售以來的天數 自上次充電后的天數 成立天數
YO502 NULL NULL 5283 NULL
YO525 NULL 2303 2303 5917
ZE100 1個 190 449 707
ZE100 2個 160 279 615
ZI402 NULL 2109 2109 NULL

結果會是什么,這只是 DaysInactive 的新列,其中包含 3 個非空 DaysSincexxx 值中的較小者:

賬號 工作 自上次銷售以來的天數 自上次充電后的天數 成立天數 不活動天數
YO502 NULL NULL 5283 NULL 5283
YO525 NULL 2303 2303 5917 2303
ZE100 1個 190 449 707 190
ZE100 2個 160 279 615 160
ZI402 NULL 2109 2109 NULL 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')

感謝任何建議! 謝謝

您可以使用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM