用于查找运行总计中的数字计数的SQL查询

时间:2017-07-07 03:56:39

标签: sql oracle postgresql

假设该表有1列ID,值如下:

ID
5
5
5
6
5
5
6
6

输出应为

ID  count
5    3
6    1
5    2
6    2

我们如何在单个SQL查询中执行此操作。

2 个答案:

答案 0 :(得分:1)

如果要查找记录的总计数,可以像

一样编写

按list_name从database_name顺序中选择count(*);

答案 1 :(得分:0)

在关系数据库中,表中的数据没有任何顺序,请参阅:https://en.wikipedia.org/wiki/Table_(database)

  

数据库系统不保证行的任何排序,除非   在查询的SELECT语句中指定了ORDER BY子句   桌子。

因此,为了获得所需的结果,您必须在表格中有一个额外的列,用于定义行的顺序(并且可以在ORDER BY子句中使用)。

在下面的检查cn列中定义了这样的顺序:

select * from tab123 ORDER BY rn;

        RN ID 
---------- -------
         1 5 
         2 5
         3 5 
         4 6 
         5 5 
         6 5
         7 6
         8 6  

从Oracle 12c版开始,可以使用新的MATCH_REGOGNIZE子句:

select * from tab123 
match_recognize(
   order by rn
   measures
     strt.id as id,
     count(*) as cnt
   one row per match
   after match skip past last row
   pattern( strt ss* )
   define ss as ss.id = prev( ss.id )
);

在支持Windows功能的早期版本(Oracle 10及更高版本)上,您可以使用两个窗口函数:LAG ... overSUM ... over,这样

select max( id ) as id, count(*) as cnt
FROM (
    select id, sum( xxx ) over (order by rn ) as yyy
    from (
        select t.*,
               case lag( id ) over (order by rn )
               when id then 0 else 1 end as xxx
        from tab123 t
    )
)
GROUP BY yyy
ORDER BY yyy;