假设该表有1列ID,值如下:
ID
5
5
5
6
5
5
6
6
输出应为
ID count
5 3
6 1
5 2
6 2
我们如何在单个SQL查询中执行此操作。
答案 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 ... over
和SUM ... 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;