目录
1. 开窗函数
开窗函数格式: 函数名(列) OVER(选项),实现的功能是通过over窗口进行透视。
函数名可以是常见的 sum(),count(),max() 等
ex1:
--结果行第三列数值一样,为满足COLC<2000 的行数
select colA,colB,count(*) over() from #table where colC<2000;
ex2:
--按照age排序,取第一行到目前行的最大colA
select age,colB,max(colA) over(order by age rows between unbounded preceding and current row) from #table where colC<2000;
--可以简化为:
select age,colB,max(colA) over(order by age) from #table where colC<2000;
ex3:
--结果是按照age排序,取小于目前行age的最大colA
select age,colB,max(colA) over(order by age range between unbounded preceding and current row) from #table where colC<2000; --不可以简化
ex4:
--结果是按照age排序,取目前行前一行及后3行colA的和
SELECT age,colB,
SUM(colA) OVER(ORDER BY age ROWS BETWEEN 1 PRECEDING AND 3 FOLLOWING)
FROM #table;
ex5:
--算当前年龄排名
SELECT age,colB,
COUNT(*) OVER(ORDER BY age ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM #table;
ex6:
--算同龄人中最高身高
SELECT age,
MAX(height) OVER(PARTITION BY Age order by height) 同龄人最高工资
FROM #table;
2. rank() vs dense_rank()
rank:假设有相同排名,后面就会吞掉占用的位置:1,2,2,4,5,6
dense_rank() :假设有相同排名,后面不会吞掉占用的位置:1,2,2,3,4,5
3. try_convert
有时候将一列从A格式转化为B格式的时候会报错,如果不知道错误具体情况很难debug,这种类型错误经常出现在,cast,convert这两个函数中,可以使用try_convert() ,try_cast() 函数解决。
try_convert(type,colNAME)
try_cast(colNAME as type)
ex: select colA from tableA
where try_convert(float,colA) is null;
4. 提示报错
Columns of type text, ntext, and image cannot be used in group_by_expression
是因为text 类型的列不可以进行排序分组等操作,需要转为varchar 形式
CAST(email AS NVARCHAR(100))