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) + 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
解这道题其实很简单,就是需要依次将n条记录分成一组。比如:【记录1、记录2、记录3】是第一组,【记录4、记录5、记录6】是第二组,以此类推,规律在于当前记录是“记录几”,用这个数字除以3取整的结果值就是分组的依据。但是SQL 没有天然的 “序号”,需要繁琐的办法人为造出来。然后才能利用它去完成以上自然思维下干的事。
用开源集算器的SPL就很容易写:
A |
|
1 |
=connect("ORACLE").query@x("SELECT * FROM EMPLOYEE ORDER BY HIREDATE") |
2 |
=A1.group@n(((#-1)\3)+1).new(#:GROUP_NO,~.avg(SALARY):AVG_SALARY) |
SPL可以直接用#表示序号,很容易实现按序号的运算结果分组。