COUNT个以前的行匹配条件

时间:2018-04-10 05:38:20

标签: sql oracle count

我的表格如下:

KEY_NAME   START_DATE    END_DATE       
 X         01.01.2014    01.07.2014 
 X         01.02.2014    15.02.2014 
 X         01.03.2014   
 X         01.05.2014       
 X         01.07.2014       
 Y         01.01.2014       
 Y         06.01.2014    16.10.2014 
 Y         30.05.2014    17.09.2014 
 Y         04.08.2014       

从每KEY_NAME的第3个订单开始,我想采用START_DATE并将其与之前行的END_DATE进行比较,并使用相同的KEY_NAME (将第3 START_DATE的{​​{1}}与第2行和第1行的KEY_NAME进行比较)

我需要END_DATEEND_DATE或大于当前NULL的前一行数。

我想要的输出(列START_DATE):

COUNT

1 个答案:

答案 0 :(得分:1)

您可以使用分析函数ROW_NUMBER()来确定每key_name的排名,然后选择符合条件的行数。

我认为您的行的顺序由start_date确定,但在选择ORDER BY时您可以使用任何其他ROW_NUMBER()

使用SQL Fiddle进行测试。

WITH cte AS
(
  SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY key_name ORDER BY start_date ) AS ord
  FROM t
)
SELECT key_name, ord,
       (
         SELECT COUNT(1)
           FROM cte cte_prev
          WHERE cte_prev.key_name = cte.key_name
            AND cte_prev.ord < cte.ord
            AND ( cte_prev.end_date >= cte.start_date OR cte_prev.end_date IS NULL )
       ) AS cnt
  FROM cte
 WHERE cte.ord >= 3
 ORDER BY cte.key_name, cte.ord;