ORACLE:当值交替时,如何获得某些值的最早记录?

时间:2018-02-02 15:45:52

标签: sql oracle

我将简化我在这里寻找的内容。

我有一个表,用于存储资产名称,日期(每天运行的作业)以及一个值为1或0的值,用于指示资产是否不合规。 我需要获得值为0的最早日期。

我遇到的问题是问题可能是间歇性的,因此同一资产可能会显示为合规,然后输出,然后再显示。我想要检索最不合规的日期这次

Asset    Date       Compliant
NAME     2-FEB-18   0
NAME     1-FEB-18   0
NAME     31-JAN-18  1
NAME     30-JAN-18  0

在这个例子中,我想要检索1-FEB-18,而不是30-JAN-18。

我使用子查询进入临时表,检索将返回30-JAN-18的MIN(日期)。想法?

匿名当前子查询:

least_recent_created AS
(
SELECT t.date,t.ASSET, t.DATABASE_NAME FROM table t
WHERE t.date = 
(
SELECT MIN(date)
FROM table2 t2
WHERE t.ASSET_ID = t2.ASSET_ID
AND t.DATABASE_NAME = t2.DATABASE_NAME
AND t2.compliant = 0
)
)

2 个答案:

答案 0 :(得分:0)

您希望自上次合规以来最早的不合规日期。如果资产从未符合规定,我认为您需要最早的日期。

select t.asset, min(date)
from (select t.*,
             max(case when t.complaint = 1 then date end) over (partition by asset) as max_compliant1_date
      from t
     ) t
where complaint = 0 and
      (date > max_complaint1_date or max_complaint1_date is null)
group by t.asset;

答案 1 :(得分:0)

您可以使用以下查询:

SELECT "Asset", MAX("Date")
FROM (
   SELECT "Asset", "Date", "Compliant",       
          CASE 
             WHEN "Compliant" = 0 AND 
                  LAG("Compliant") OVER (PARTITION BY "Asset" 
                                         ORDER BY "Date") = 1 THEN "Date"
          END AS OutOfComplianceDate    
   FROM mytable)  t
WHERE OutOfComplianceDate IS NOT NULL   
GROUP BY "Asset"   

内部查询标识“不合规”'日期,即当前记录为"Compliant" = 0的日期,而紧接在前的记录为"Compliant" = 1

外部查询返回最新的“不合规”信息。每"Asset"日期。

Demo here