有两个导数据的需求,
1、一张表里面每一个订单号可能对应多条数据,每个单号返回时间最早的那条。
2、根据条件查询某个字段并按照逗号,合并在一起。
表类似结构如下:
第一条sql:
select c.Id,c.OrderNum, c.CreateTime FROM (select t.*,row_number() over(partition by t.OrderNum order by t.CreateTime ) rn from Payinfo t WHERE t.OrderNum IN('20160906025229','20160905006031','20160905016570')) c WHERE rn = 1;
执行效果如下:
主要知识点:over partition by
over partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,常用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组 。
Group by 与 over partition by都可以实现分组统计功能.
Group by 根据一列或者多列的值或表达式将选定的行进行一个摘要分组,每一个分组只返回一行。
第二条sql:
SELECT TOP 1 data=STUFF((SELECT ','+ CAST(id AS VARCHAR(10)) FROM Payinfo t WHERE OrderNum IN('20160906025229','20160905006031') FOR XML PATH('')), 1, 1, '')
FROM Payinfo t1
执行效果如下:
主要知识点:FOR XML PATH
将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。
有关FOR XML PATH更多知识,我觉得下面这篇文章讲的很好:
灵活运用 SQL SERVER FOR XML PATH
作 者:
骑着蜗牛望太阳
出 处:http://www.cnblogs.com/1024zy/
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我。
感谢您的阅读,如果您对我的博客所讲内容有兴趣,请关注我的博客,您的鼓励是作者坚持原创和持续写作的最大动力!