当前位置:首页 » 编程语言 » sql区间分组
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql区间分组

发布时间: 2022-06-08 21:31:22

sql如何根据指定列的不同值区间分段

select
count(case when col_a between 0 and 10 then col_a end)
,count(case when col_a between 20 and 30 then col_a end)
,count(case when col_a between 3 and 40 then col_a end)
from tablename1

Ⅱ SQL rownumber partition 取范围数据进行分组

oracle中,分组后,取各组的前n条记录的sql语句:rownumber() over()

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .
lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。

看几个SQL语句:
语句一:
select row_number() over(order by sale/cnt desc) as sort, sale/cnt
from (
select -60 as sale,3 as cnt from al union
select 24 as sale,6 as cnt from al union
select 50 as sale,5 as cnt from al union
select -20 as sale,2 as cnt from al union
select 40 as sale,8 as cnt from al);

执行结果:
SORT SALE/CNT
---------- ----------
1 10
2 5
3 4
4 -10
5 -20

语句二:查询员工的工资,按部门排序
select ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order from scott.emp;
执行结果:
ENAME SAL SAL_ORDER
-------------------- ---------- ----------
KING 5000 1
CLARK 2450 2
MILLER 1300 3
SCOTT 3000 1
FORD 3000 2
JONES 2975 3
ADAMS 1100 4
SMITH 800 5
BLAKE 2850 1
ALLEN 1600 2
TURNER 1500 3
WARD 1250 4
MARTIN 1250 5
JAMES 950 6

已选择14行。
语句三:查询每个部门的最高工资
select deptno,ename,sal from
(select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order
from scott.emp) where sal_order <2;

执行结果:
DEPTNO ENAME SAL
---------- -------------------- ----------
10 KING 5000
20 SCOTT 3000
30 BLAKE 2850

已选择3行。
语句四:
select deptno,sal,rank() over (partition by deptno order by sal) as rank_order from scott.emp order by deptno;
执行结果:
DEPTNO SAL RANK_ORDER
---------- ---------- ----------
10 1300 1
10 2450 2
10 5000 3
20 800 1
20 1100 2
20 2975 3
20 3000 4
20 3000 4
30 950 1
30 1250 2
30 1250 2
30 1500 4
30 1600 5
30 2850 6

已选择14行。
语句五:
select deptno,sal,dense_rank() over(partition by deptno order by sal) as dense_rank_order from scott.emp order by deptn;执行结果:
DEPTNO SAL DENSE_RANK_ORDER
---------- ---------- ----------------
10 1300 1
10 2450 2
10 5000 3
20 800 1
20 1100 2
20 2975 3
20 3000 4
20 3000 4
30 950 1
30 1250 2
30 1250 2
30 1500 3
30 1600 4
30 2850 5

已选择14行。
语句六:
select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) as lag_ from scott.emp order by deptno;
执行结果:
DEPTNO ENAME SAL LAG_
---------- -------------------- ---------- --------------------
10 CLARK 2450
10 KING 5000 CLARK
10 MILLER 1300 KING
20 ADAMS 1100
20 FORD 3000 ADAMS
20 JONES 2975 FORD
20 SCOTT 3000 JONES
20 SMITH 800 SCOTT
30 ALLEN 1600
30 BLAKE 2850 ALLEN
30 JAMES 950 BLAKE
30 MARTIN 1250 JAMES
30 TURNER 1500 MARTIN
30 WARD 1250 TURNER

已选择14行。

Ⅲ SQL对取值范围进行分组汇总的几种办法

可以用到自定义函数,
create or replace FUNCTION g2(v NUMBER) RETURN INT IS
TYPE it IS TABLE OF INT;
BEGIN
IF v>0 AND v<= 500 THEN
RETURN 1;
ELSIF v>500 AND v<= 1000 THEN
RETURN 2;
ELSIF v>1000 AND v<= 5000 THEN
RETURN 3;
ELSIF v>5000 AND v<= 20000 THEN
RETURN 4;
ELSE
RETURN 0;
END IF;
END g2;
/
select g2(id) f, count(1) cnt from t1 group by g2(id) order by 1;
F CNT
---------- ----------
1 500
2 500
3 4000
4 15000

当然,我们也可以不借助函数,而用case when语句实现同样的条件分组,但是语句比较冗长,列名是固定的。不利于阅读与修改,也不利于代码重用。
select (case
when id >0 AND id<= 500 THEN 1
when id >500 AND id<= 1000 THEN 2
when id >1000 AND id<= 5000 THEN 3
when id >5000 AND id<= 20000 THEN 4
else 0
end) f,
count(1) cnt from t1 group by
(case
when id >0 AND id<= 500 THEN 1
when id >500 AND id<= 1000 THEN 2
when id >1000 AND id<= 5000 THEN 3
when id >5000 AND id<= 20000 THEN 4
else 0
end)
order by 1;
F CNT
---------- ----------
1 500
2 500
3 4000
4 15000

Ⅳ SQL中分组短语是什么

SQL中分组短语是:group by。

GROUP BY 语句

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

GROUP BY 语法

SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator valueGROUP BY column_name

Group By 的使用:

1、 Group By [Expressions]:

这个恐怕是Group By语句最常见的用法了,Group By + [分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。比如有如下数据集,其中水果名称(FruitName)和出产国家(ProctPlace)为联合主键:


SELECTFruitName,ProctPlace,Price,IDASIDE,Discount
FROMT_TEST_FRUITINFO
WHERE(ProctPlace=N'china')ORDERBYIDE

这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE。

以上就是Group By的相关使用说明。内容参考与网站CSDN中的“SQL语句Group By 语句小结“。

Ⅳ sql按区间分组汇总,SQL高手指教啊!

select a.a1,a.a2,
sum(case when c.b1='01' then c.b4 end) 一月份,
sum(case when c.b1='01' then c.b4 end) 二月份,
sum(case when c.b1='01' then c.b4 end) 三月份,
sum(case when c.b1='01' then c.b4 end) 四月份,
sum(case when c.b1='01' then c.b4 end) 五月份,
sum(case when c.b1='01' then c.b4 end) 六月份,
sum(case when c.b1='01' then c.b4 end) 七月份,
sum(case when c.b1='01' then c.b4 end) 八月份,
sum(case when c.b1='01' then c.b4 end) 九月份,
sum(case when c.b1='01' then c.b4 end) 十月份,
sum(case when c.b1='01' then c.b4 end) 十一月份,
sum(case when c.b1='01' then c.b4 end) 十二月份 from
a,
(select substring(b1,1,6) as b1,b2,b3,sum(b4) as b4 from b group by substring(b1,1,6),b2,b3) as c
where a.a1=b.b2
group by a.a1,a.a2

oracle的话把substring改成substr就行

Ⅵ 怎样sql统计数据区间分布

select
count(case when time>=1 and time <=2 then muid end),
count(case when time>=2.1 and time <=3 then muid end),
count(case when time>=3.1 and time <=4 then muid end)
from table

Ⅶ sql 指定时间段内分组计算

应该是五个字段吧?
select a,sum(b) as b ,sum(c) as c,sum(d) as d
from table1
where e between '2011-1-1' and '2011-1-3'
group by a
改成这样就可以了

select a,sum(b) as b ,sum(c) as c
from table1
where d between '2011-1-1' and '2011-1-3'
group by a

Ⅷ SQL 范围分组的视图问题

这个问题有点复杂,如果间隔是60的话,还好,你可以通过整除60来达到目的,如果间隔没有规律的话,只能通过以下办法处理:1、设置函数,在函数里定好你的分组内容,然后在SQL语句里调用函数;2、建立表进行分组,像你这种情况,可以建立一个表分组表,字段有:组别、上限、下限三项内容,你把你所要分组的字段和这个表进行连接就完事了,然后进行分组。

Ⅸ 在mssql分组查询一组区间内的断号区间的sql语句

可以提供思路:

想要做到4-6,8-19可能比较复杂,但是想要把断号的找出来容易;

首先需要建一个没有断号的临时表:可以按照全宗号,目录号分组,取出各分组案卷号最大最小值,然后散开(注意:可能缺失的就是极值)散开的函数数据库都不一样(笛卡尔积也可以),pgsql有generate_series();