Sybase IQ常用函数大全--分析函数

61 篇文章 0 订阅
48 篇文章 1 订阅

Sybase IQ常用函数大全–分析函数

查询索引:

  1. DENSE_RANK 函数:排列组中的项目。就是按照某一个条件排序,形成行号,如果值相等则行号相等,接下来的值不会跳一个行号,而会继续往下形成。
  2. NTILE 函数:将查询结果分配到指定数量的表元中,并为表元中的每一行指派相应的表元号。就是给定一个数 n,将结果集切分成 n 等份,每份给一个相同的行号。
  3. RANK 函数:排列组中的项目。就是按照某一个条件排序,形成行号,如果值相等则行号相等,接下来的值会跳一个行号,再继续往下形成。
  4. ROW_NUMBER 函数:就是按照某一个条件排序,形成行号,不管值相不相等都会按顺序往下生成行号。

1. DENSE_RANK 函数

排列组中的项目。

语法:
DENSE_RANK () OVER ( ORDER BY <expression> [ ASC | DESC ] )
解析:
  • 简而言之:就是按照某一个条件排序,形成行号,如果值相等则行号相等,接下来的值不会跳一个行号,而会继续往下形成。
  • 这个与 RANK 函数类似,但是一个是跳过,一个是不跳过下一个行号
参数说明
expression排序规范,可以是涉及列引用、集合的任意有效表达式,也可以是调用这些项目的表达式。
  • DENSE_RANK 是秩分析函数。行 R 的密集排名是指位于该行前面(包括行 R)并且在 OVER 子句指定的组中或者在整个结果集中保持不重复的行数。DENSE_RANK 和 DENSE_RANK 之间的区别是:当存在并列排名时,RANK 不会保留空位。存在并列排名时 RANK 会留空位。
  • DENSE_RANK 需要使用 OVER (ORDER BY) 子句。ORDER BY 子句指定要执行排序的参数以及每个组中行的排列顺序。此 ORDER BY 子句只在 OVER 子句中使用,而不是 SELECT 的 ORDER BY。不允许排序查询中的任何集合函数指定 DISTINCT。
  • OVER 子句表示函数对查询结果集进行操作。结果集是在对 FROM、WHERE、GROUP BY 和 HAVING 子句求值完成之后返回的行。OVER 子句定义要包括在秩分析函数计算中的行数据集。
  • ASC 或 DESC 参数用于指定升序或降序排序序列。升序是缺省值。
  • DENSE_RANK 只能在 SELECT 或 INSERT 语句的选择列表中使用,或者在 SELECT 语句的 ORDER BY 子句中使用。DENSE_RANK 可以在视图中或联合中使用。您不能在子查询中、HAVING 子句中,或者 UPDATE 或 DELETE 语句的选择列表中使用 DENSE_RANK 函数。每个查询仅允许使用一个秩分析函数。
示例:
SELECT s_suppkey, DENSE_RANK()
OVER ( ORDER BY ( SUM(s_acctBal) DESC )
AS rank_dense FROM supplier GROUP BY s_suppkey;
s_suppkeysum_acctBalrank_dense
supplier#011200,0001
supplier#002200,0001
supplier#013123,0002
supplier#004110,0003
supplier#035110,0003
supplier#00650,0004
supplier#02110,0005

2. NTILE 函数

将查询结果分配到指定数量的表元中,并为表元中的每一行指派相应的表元号。

语法:
NTILE ( <expression1> )
OVER ( ORDER BY <expression2> [ ASC | DESC ] )
解析:
  • 简而言之:就是给定一个数 n,将结果集切分成 n 等份,每份给一个相同的行号。
参数说明
expression11 到 32767 之间的一个常量整数,该整数指定表元的数量。
expression2排序规范,可以是涉及列引用、集合的任意有效表达式,也可以是调用这些项目的表达式。
  • NTILE 需要使用 OVER (ORDER BY) 子句。ORDER BY 子句指定要执行排序的参数以及每个组中行的排列顺序。此 ORDER BY 子句只在 OVER 子句中使用,而不是 SELECT 的 ORDER BY。不允许排序查询中的任何集合函数指定 DISTINCT。
  • OVER 子句表示函数对查询结果集进行操作。结果集是在对 FROM、WHERE、GROUP BY 和 HAVING 子句求值完成之后返回的行。OVER 子句定义要包括在秩分析函数计算中的行数据集。
    ASC 或 DESC 参数用于指定升序或降序排序序列。升序是缺省值。
  • NTILE 只能在 SELECT 或 INSERT 语句的选择列表中使用,或者在 SELECT 语句的 ORDER BY 子句中使用。NTILE 可以在视图中或联合中使用。您不能在子查询、HAVING 子句或者 UPDATE 或 DELETE 语句的选择列表中使用 NTILE 函数。每个查询仅允许使用一个 NTILE 函数。
示例:

以下示例使用 NTILE 函数来确定汽车经销商的销售状态。根据各位经销商售出的汽车数量将经销商分为四组。ntile 为 1 的经销商在汽车销售量排名中位于前 25%。

SELECT dealer_name, sales,
NTILE(4) OVER ( ORDER BY sales DESC )
FROM carSales;
dealer_namesalesntile
Boston10001
Worcester9501
Providence9501
SF9401
Lowell9002
Seattle9002
Natick8702
New Haven8502
Portland8003
Houston7803
Hartford7803
Dublin7503
Austin6504
Dallas6404
Dover6004

3. RANK 函数

排列组中的项目。

语法:
RANK () OVER ( [ PARTITION BY ] ORDER BY < expression> [ ASC | DESC ] )
解析:
  • 简而言之:就是按照某一个条件排序,形成行号,如果值相等则行号相等,接下来的值会跳一个行号,再继续往下形成。
  • 这个与 DENSE_RANK 函数类似,但是一个是跳过,一个是不跳过下一个行号
参数说明
expression排序规范,可以是涉及列引用、集合的任意有效表达式,也可以是调用这些项目的表达式。
  • RANK 是秩分析函数。行 R 的秩是指位于 R 前面但不是 R 的对等行的行数。如果有两个或多个行在 OVER 子句指定的组中或者在整个结果集中是不重复的,则连续秩编号中存在一个或多个空位。RANK 和 DENSE_RANK 之间的区别是: **当存在并列排名时,DENSE_RANK 不会保留空位。存在并列排名时 RANK 会留空位。 **
  • RANK 需要使用 OVER (ORDER BY) 子句。ORDER BY 子句指定要执行排序的参数以及每个组中行的排列顺序。此 ORDER BY 子句只在 OVER 子句中使用,而不是 SELECT 的 ORDER BY。不允许排序查询中的任何集合函数指定 DISTINCT。
  • OVER (ORDER BY) 子句中的 PARTITION BY 窗口分区子句是可选的。
    ASC 或 DESC 参数用于指定升序或降序排序序列。升序是缺省值。
  • OVER 子句表示函数对查询结果集进行操作。结果集是在对 FROM、WHERE、GROUP BY 和 HAVING 子句求值完成之后返回的行。OVER 子句定义要包括在秩分析函数计算中的行数据集。
  • RANK 只能在 SELECT 或 INSERT 语句的选择列表中使用,或者在 SELECT 语句的 ORDER BY 子句中使用。RANK 可以在视图中或联合中使用。您不能在子查询、HAVING 子句或者 UPDATE 或 DELETE 语句的选择列表中使用 RANK 函数。每个查询仅允许使用一个秩分析函数。
示例:
SELECT Surname, Sex, Salary, RANK() OVER (PARTITION BY Sex
ORDER BY Salary DESC) AS RANK FROM Employees
WHERE State IN ('CA', 'AZ') AND DepartmentID IN (200, 300)
ORDER BY Sex, Salary DESC;
SurnameSexSalaryRANK
SavarinoF72300.0001
JordanF51432.0002
ClarkF45000.0003
ColemanM42300.0001
OverbeyM39300.0002

4. ROW_NUMBER 函数

一个秩函数,它为窗口分区中的每一行返回一个唯一行号,以便在每个窗口分区开始时对行重新进行编号。如果窗口分区不存在,则该函数按从 1 到表基数的顺序对结果集中的行进行编号。

语法:
ROW_NUMBER() OVER ([PARTITION BY <window partition>] ORDER BY <window ordering>)
解析:
  • 简而言之:就是按照某一个条件排序,形成行号,不管值相不相等都会按顺序往下生成行号。
参数说明
window partition(可选)一个或多个用逗号分隔的值表达式,表示您希望如何分隔一组结果行。
窗口排序(window ordering)如果指定窗口分区,则定义用于对窗口分区中的行进行排序的表达式;如果未指定窗口分区,则定义用于对结果集中的行进行排序的表达式。
  • ROW_NUMBER 函数需要 OVER (ORDER_BY) 窗口规范。OVER (ORDER_BY) 子句中的窗口分区子句是可选的。OVER (ORDER_BY) 子句不能包含窗口构架 ROWS/RANGE 规范。
示例:

以下示例返回 Employees 表中的薪水数据,按部门 ID 对结果集进行分区,并根据雇用开始日期对数据进行排序。ROW_NUMBER 函数为每一行指派一个行号,并对每个窗口分区中的行重新开始编号:

SELECT DepartmentID dID, StartDate, Salary, ROW_NUMBER()OVER(PARTITION BY dID ORDER BY StartDate) FROM Employees ORDER BY 1,2;
dIDStartDateSalaryRow_number()
1001986-10-1442,998.0001
1001987-07-2339,875.5002
1001988-03-2337,400.0003
1001989-04-2042,500.0004
1001990-01-1542,100.0005
2001985-02-0338,500.0001
2001987-02-1939,300.0002
2001988-11-2239,800.0003
2001989-06-0134,892.0004
2001990-05-1333,890.0005
2001990-07-1137,803.0006
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值