El problema del juicio de subordinación en datos estructurados

1. Detección de inclusión de colecciones

En una tabla, busque registros basados ​​en la inclusión del conjunto.

[Ejemplo 1] En la tabla de empleados, calcule el salario promedio de cada departamento en las ciudades de primer nivel. Parte de los datos son los siguientes:

CARNÉ DE IDENTIDAD NOMBRE CIUDAD SALARIO
1 Rebeca Tianjin 7000
2 Ashley Tianjin 11000
3 Raquel Shijiazhuang 9000
4 Emily Shenzhen 7000
5 Ashley Nanjing 16000
... ... ... ...

[Ideas para resolver preguntas]

    Al seleccionar datos de la tabla de empleados, es necesario determinar si la ciudad del empleado pertenece a un conjunto constante que consta de Beijing, Shanghai, Guangzhou y Shenzhen. Cuando el número de miembros en el conjunto es menor que 10, la función A.contain () se puede usar para filtrar.

[Secuencia de comandos SPL]


UNA segundo
1 = conectar ("db"). consulta ("seleccionar * de Empleado") / Conéctese a la base de datos y consulte la tabla de empleados
2 [Pekín, Shanghái, Guangzhou, Shenzhen] / Crea un conjunto constante de ciudades de primer nivel
3 = A1.seleccionar (A2.contain (CIUDAD)) / Utilice la función A.contain () para seleccionar los registros donde la ciudad está contenida en las ciudades de primer nivel.
4 = A3. Grupos (DEPT; avg (SALARIO): SALARIO) / Agrupar y resumir el salario medio de cada departamento

Los resultados de A4 son los siguientes:

DEPT SALARIO
Finanzas 7833.33
HORA 7187.5
Márketing 7977.27
... ...

 

En una tabla, busque registros basados ​​en el juicio inclusivo de un conjunto más grande.

[Ejemplo 2] En la tabla de ventas, cuente las ventas mensuales de los principales clientes en 2014. Parte de los datos son los siguientes:

CARNÉ DE IDENTIDAD Cliente SellerId Fecha Cantidad
10400 EASTC 1 2014/01/01 3063.0
10401 HANAR 1 2014/01/01 3868,6
10402 ERNSH 8 2014/01/02 2713.5
10403 ERNSH 4 2014/01/03 1005,9
10404 MAGAA 2 2014/01/03 1675.0
... ... ... ... ...

[Ideas para resolver preguntas]

Esta pregunta es similar a la del [Ejemplo 1]: al seleccionar datos de la tabla de ventas, es necesario juzgar si el cliente de ventas pertenece al conjunto constante de grandes clientes. Cuando el conjunto tiene muchos miembros (más de 10), puede ordenar el conjunto de constantes primero y luego usar la opción @b de la función A.contain () para realizar una búsqueda binaria.

[Secuencia de comandos SPL]


UNA segundo
1 = conectar ("db"). consulta ("seleccionar * de Ventas") / Conéctese a la base de datos y consulte la tabla de ventas
2 = ["SAVEA", "QUICK", "ERNSH", "HUN", "RATTC", "HANAR", "FOLKO", "QUEEN, MEREP", "WHITC", "FRANK", "KOENE"]. Ordenar () / Cree una colección constante de grandes clientes y clasifique
3 = A1.select (año (Fecha) == 2014 && A2.contain@b (Cliente)) / Seleccione los registros de los principales clientes en 2014. Cuando el conjunto A está ordenado, use la opción @b de la función A.contain () para realizar una búsqueda binaria.
4 = A3.groups (mes (fecha): mes; suma (monto): monto) / Agrupar y resumir las ventas mensuales

Los resultados de A 4 son los siguientes:

ESTADO SALARIO
California 7700.0
Texas 7592.59
Nueva York 7677.77
Florida 7145.16
Otro 7308.1

 

2. Detección de inclusión de asignación de clave externa

En las dos tablas, los registros se buscan en función de la detección de inclusión de la asignación de clave externa.

[Ejemplo 3] Consulta cuántos estudiantes de cada clase han tomado el curso "Matlab". La selección de cursos y el horario de los cursos son los siguientes:

..

[Ideas para resolver preguntas]

从选课表选出数据时,需要判断课程的名称是否等于“Matlab”。可以先在课程表中筛选出课程名称是“Matlab”的课程集合,再选出选课表的课程 ID 从属于这个集合的记录。

【SPL 脚本】


A B
1 =connect("db") /连接数据库
2 =A1.query("select * from Course") /查询课程表
3 =A1.query("select * from   SelectCourse") /查询选课表
4 =A2.select(Name=="Matlab") /从课程表中选出指定课程
5 =A3.join@i(CourseID, A4:ID) /使用函数 A.join() 的 @i 选项进行连接过滤
6 =A5.groups(Class; count(1):SelectCount) /分组汇总各班报名的人数

A6的执行结果如下:

Class SelectCount
Class   1 3
Class   2 5

 

3. 非外键的包含性检测

在两个表中,根据非外键的包含性检测查找记录。

【例 4】 查询各班所有某科成绩超过 80 分的学生数量。成绩表和学生表如下:

..

【SQL 语句】

从学生表选出数据时,需要判断学生是否有单科成绩超过 80 分的。可以先在成绩表中选出所有大于 80 分的记录,再按学生 ID 去重,得到某科成绩高于 80 分的学生 ID 的集合。接下来只要选出学生的 ID 从属于这个集合的记录。

【SPL 脚本】


A B
1 =connect("db") /连接数据库
2 =A1.query("select * from   Student") /查询学生表
3 =A1.query("select * from Score") /查询学生成绩表
4 =A3.select(Score>80) /选出有成绩超过 80 分的记录
5 =A4.id(StudentID) /使用 id 函数按学生 ID 去重
6 =A2.join@i(ID, A5) /使用函数 A.join@i() 连接过滤
7 =A6.groups(Class; count(1):StudentCount) /分组汇总每个班级的学生数量

A7的执行结果如下:

Class StudentCount
Class   1 9
Class   2 11

 

在两个表中,根据非外键的匹配性检测查找记录,优化提速。

【例 5】查询 2014 年各城市有销售记录的客户数量。销售表和客户表如下:

..

【解题思路】

从客户表选出数据时,需要判断客户在 2014 年是否有销售记录。可以先在销售表中选出 2014 年的记录,再按客户 ID 去重,得到 2014 年有销售记录的客户 ID 的集合。接下来只要选出客户表的 ID 从属于这个集合的记录。

【SPL 脚本】


A B
1 =connect("db") /连接数据库
2 =A1.query("select * from   Customer") /查询客户表
3 =A1.query("select * from Sales where   year(Date)=2014 order by CustomerID") /查询 2014 年的销售记录,并按客户 ID 排序
4 =A3.groups@o(ID) /使用 groups 函数按客户 ID 去重,有序时使用 @o 选项
5 =A2.join@i(ID, A4:CustomerID) /使用函数 A.join@i() 连接过滤
6 =A5.groups(City; count(1):CustomerCount) /分组汇总每个城市的客户数量

A6的执行结果如下:

City CustomerCount
Dongying 6
Tangshan 7

 

4. 外键映射的不包含性检测

在两个表中,根据外键映射的不包含性检测查找记录。

【例 6】 查询 2014 年每个新增客户的销售总额。销售表和客户表如下:

..

【解题思路】

从客户表选出数据时,需要判断该客户在 2014 年没有销售记录。可以先在销售表中筛选出 2014 年有销售记录的集合,再选出客户表的 ID 不从属于这个集合的记录。

【SPL 脚本】


A B
1 =connect("db") /连接数据库
2 =A1.query("select * from Sales where   year(OrderDate)=2014") /查询 2014 年的销售记录
3 =A1.query("select * from   Customer") /查询客户表
4 =A2.join@d(CustomerID ,A3:ID) /使用函数 A.join@d() 从销售表中选出客户 ID 在客户表中不存在的记录
5 =A4.groups(CustomerID; sum(Amount):Amount) /分组汇总每个客户的销售额

A5的执行结果如下:

CustomerID Amount
DOS 11830.1
HUN 57317.39

 《SPL CookBook》中还有更多相关计算示例。


Supongo que te gusta

Origin blog.51cto.com/12749034/2547131
Recomendado
Clasificación