[英]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.