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