2017-03-06 76 views
-1

我们试图通过检查下一行值来得到结果组。Oracle Group by by based next row value

样本数据

Table A 

COL1 COL2 COL3 
---- ---- ---- 
B BUY  1 
B SELL 1.2 
B SELL 2 
C BUY  3 
C SELL 4 
C BUY  5 

结果

COL1 COL2 COUNT(1) 
---- ---- -------- 
B BUY   1 
B SELL  2 
C BUY   1 
C SELL  1 
C BUY   1 

回答

0

您似乎已订购COL3;如果是这样的话,那么:

SELECT col1, 
     col2, 
     change - COALESCE(LAG(change) OVER (PARTITION BY col1 ORDER BY change), 0) 
     AS cnt 
FROM (
    SELECT col1, 
     col2, 
     CASE LEAD(col2) OVER (PARTITION BY col1 ORDER BY col3) 
      WHEN col2 
      THEN NULL 
      ELSE ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col3) 
     END AS change 
    FROM a 
) 
WHERE change IS NOT NULL; 
0

如果我理解正确的话,你可以用的行数方法是不同的做到这一点:

select col1, col2, count(*) 
from (select t.*, 
      row_number() over (partition by col1 order by col3) as seqnum, 
      row_number() over (partition by col1, col2 order by col3) as seqnum_2, 
     from t 
    ) t 
group by col1, col2, (seqnum - seqnum_2); 

这标识根据col3中的排序,相邻col2值的组。

+0

我失去了上述查询行的排序,有没有一种方法保存结果的顺序? –

+0

@HarshMehta,你如何确定数据集中的行顺序?订单不保证没有订单,那么您将在您的示例数据中订购什么? – xQbert

+0

@HarshMehta。 。 。我不知道你的意思。这似乎是获得你想要的最简单的方法。 –