---------------------------------------test windows functionselect *,
sum(grade) over() "sum",
sum(grade) over(partition by grade_stuno) "sum partition",
row_number() over(orderby grade) "row number",
rank() over(orderby grade) "rank",
dense_rank() over(orderby grade) "dense_rank",
ntile(5) over(orderby grade) "ntile"from tgrade
--test distinct+orderbyselect grade_stuno from tgrade orderby grade
selectdistinct grade_stuno from tgrade orderby grade --ERROR
/*SQL Server Database Error: ORDERBY items must appear in the select list ifSELECTDISTINCTis specified.*/
selectdistinct grade_stuno,grade from tgrade orderby grade
/*orderby 的字段必须在distinct的字段中
RUN Steps:distinct -> orderby -> top -> orderby(show data) */
--test top
select top 1 grade_stuno from tgrade orderby grade
selectdistinct top 2 grade_stuno,grade from tgrade orderby grade descselect * from (select grade_stuno,grade from tgrade orderby grade desc) t --ERROR (∵result set不是集合,可能是超集或者是包)
/*The ORDERBY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET orFOR XML is also specified.*/
--用top 100 percent 绕过报错
select * from (select top 100 percent grade_stuno,grade from tgrade orderby grade desc) t
--小众用法
select top 4 * from tgrade orderby grade descselect top 4with ties * from tgrade orderby grade desc --top最后一行的排序字段的值相等的行都会出来
--test windows function+distinct+orderbyselectdistinct row_number() over(orderby grade) as ID,
grade_stuno,grade
from tgrade
orderby grade_stuno,grade
--distinct 失效(先开窗,后distinct)
--上面需求的正确实现方法
selectdistinct row_number() over(orderby grade) as ID,
grade_stuno,grade
from tgrade
groupby grade_stuno,grade
/*SQL执行顺序:
from->where->groupby->having->select(over->distinct->top)->orderby*/
--clear
droptable Tgrade