SQL 如何按数据的位置分组
数据表EMPLOYEE是员工数据,部分数据如下:
EID
NAME
GENDER
STATE
HIREDATE
SALARY
1
Rebecca
F
California
2005/3/11
7000
2
Ashley
F
New York
2008/3/16
11000
3
Rachel
F
New Mexico
2010/12/1
9000
4
Emily
F
Texas
2006/8/15
7000
5
Ashley
F
Texas
2004/7/30
16000
…
…
…
…
…
…
需要根据员工的入职时间平均分成三组,统计每组的平均工资。
将员工按照入职时间的顺序来分组,前三分之一分配到第一组,中间三分之一分配到第二组,剩下的三分之一分配到第三组。最后统计每组的平均工资。
ORACLE的SQL:
SELECT GROUP_NO, avg(SALARY) AS AVG_SALARY
FROM (
SELECT TRUNC((rn - 1) * 3 / (
SELECT count(*)
FROM EMPLOYEE
)) + 1 AS GROUP_NO
, SALARY
FROM (
SELECT SALARY, ROW_NUMBER() OVER (ORDER BY HIREDATE) AS rn
FROM EMPLOYEE
)
)
GROUP BY GROUP_NO
ORDER BY GROUP_NO
解这道题其实很简单,依次计算出当前记录在所有记录中的位置,按位置把数据分组即可。关键在于要算位置,就需要先知道当前记录是“第几条记录”,才能算出记录所在的位置。但是SQL 没有天然的 “序号”,需要繁琐的办法人为造出来。然后才能利用它去算记录的位置。
用开源集算器的SPL就很容易写:
A |
|
1 |
=connect("ORACLE").query@x("SELECT * FROM EMPLOYEE ORDER BY HIREDATE") |
2 |
=A1.group@n((#-1)*3\A1.len()+ 1).new(#:GROUP_NO,~.avg(SALARY):AVG_SALARY) |
SPL可以直接用#表示序号,很容易实现按序号的运算结果分组。