簡體   English   中英

使用Oracle SQL根據列的唯一組合比較同一表中的行

[英]Compare rows in the same table using Oracle SQL based on unique combinations of columns

我在Stackoverflow上看到了一些與比較行有關的問題,但與這個問題完全不同。 我有一個表,其列類似於:

 - Month       (Date (01-Jan-2013)
 - Country     (Varchar2)
 - SubCustomer (Varchar2)
 - FTE         (Number) Represents a value that is manually entered by employees each month

我們可能有一些這樣的數據。

 - 01-Jan-2013 USA Customer1 10
 - 01-Feb-2013 USA Customer1 15
 - 01-Mar-2013 USA Customer1 30
 - 01-Jan-2013 BRA Customer2 100
 - 01-Feb-2013 BRA Customer2 300
 - 01-Mar-2013 BRA Customer2 50

我的目標是比較輸入的FTE,如果輸入的FTE為每個月的上個月+/- 2倍,則在“高警報”,“低警報”或“確定”等單獨的列中提供警報。國家+子客戶。 我一直在使用不同的Case語句,但是似乎無法逐月進行比較。

使用上面的數據,客戶1將在2月到3月之間產生“高警報”警報,而客戶2將在1月到2月之間產生高警報,而2月至3月則產生低警報。

聽起來您應該使用LAG / LEAD。

SELECT Month, Country, SubCustomer, FTE
, LAG(FTE, 1, 0) OVER (PARTITION BY Country, SubCustomer ORDER BY Month) as PrevFTE
FROM MyTable

您可以在此處找到一些很好的示例: http : //www.oracle-base.com/articles/misc/lag-lead-analytic-functions.php

試試這個: 包含NULL或零的可能性

WITH TABLEDATA
    AS (SELECT
             TO_DATE ( '01-Jan-2013',
                     'DD-MON-YYYY' )
                 AS MONT,
             'USA' AS COUNTRY,
             'Customer1' AS SUBCUST,
             0 AS FTE
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '01-Feb-2013',
                     'DD-MON-YYYY' )
                 AS MONT,
             'USA' AS COUNTRY,
             'Customer1' AS SUBCUST,
             15 AS FTE
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '01-Mar-2013',
                     'DD-MON-YYYY' )
                 AS MONT,
             'USA' AS COUNTRY,
             'Customer1' AS SUBCUST,
             30 AS FTE
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '01-Jan-2013',
                     'DD-MON-YYYY' )
                 AS MONT,
             'BRA' AS COUNTRY,
             'Customer2' AS SUBCUST,
             100 AS FTE
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '01-Feb-2013',
                     'DD-MON-YYYY' )
                 AS MONT,
             'BRA' AS COUNTRY,
             'Customer2' AS SUBCUST,
             300 AS FTE
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '01-Mar-2013',
                     'DD-MON-YYYY' )
                 AS MONT,
             'BRA' AS COUNTRY,
             'Customer2' AS SUBCUST,
             50 AS FTE
        FROM
             DUAL)
SELECT
      MONT,
      COUNTRY,
      SUBCUST,
      FTE,
      ROUND ( ( FTE
             - PREVIOUS_FTE )
            / NULLIF ( PREVIOUS_FTE,
                     0 ),
            2 )
      * 100
          CHANGE_IN_PERCENT,
      CASE
          WHEN ROUND ( ( FTE
                     - PREVIOUS_FTE )
                    / NULLIF ( PREVIOUS_FTE,
                             0 ),
                    2 )
              * 100 >= 200
          THEN
              'High Alert'
          WHEN ROUND ( ( FTE
                     - PREVIOUS_FTE )
                    / NULLIF ( PREVIOUS_FTE,
                             0 ),
                    2 )
              * 100 <= 200
          THEN
              'Low Alert'
          ELSE
              'OK'
      END
          AS ALERTS
FROM
      (SELECT
            MONT,
            COUNTRY,
            SUBCUST,
            FTE,
            LAG ( FTE,
                 1 )
            OVER (PARTITION BY COUNTRY, SUBCUST ORDER BY MONT)
                PREVIOUS_FTE
       FROM
            TABLEDATA);

結果:

MONT        COUNTRY SUBCUST FTE CHANGE_IN_PERCENT ALERTS
1/1/2013    BRA Customer2   100                   OK
2/1/2013    BRA Customer2   300 200               High Alert
3/1/2013    BRA Customer2   50  -83               Low Alert
1/1/2013    USA Customer1   0                     OK
2/1/2013    USA Customer1   15                    OK
3/1/2013    USA Customer1   30  100               Low Alert

暫無
暫無

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

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