Sql2005 tips 按照某些条件(一个or多个)分组,取分组中满足某个条件的一条记录
2009-09-23 20:22
495 查看
按照某些条件(一个or多个)分组,取分组中满足某个条件的一条记录:
Sampel1:
SerialNumber SONumber CustomerNumber SOAmount
------------ ----------- -------------- ---------------------------------------
1619648 1216 1370473 0.00
1619649 1216 1370473 0.00
1210509 1216 1370473 0.01
1621946 421648 600121 70.01
1621947 421648 600121 520.02
1210209 1645026 654728 0.00
1210212 1645026 654728 64.70
1210213 1645026 654728 64.70
1210234 1645026 654728 172.35
1210229 1645026 654728 174.48
1210512 1732653 735175 -1.99
1210240 1732653 735175 0.00
1210265 1732653 735175 1000.00
1210267 1732653 735175 5000.00
1210295 1732653 735175 10000.00
1210266 1732653 735175 10000.00
1210268 1732653 735175 100000.00
取SO# 最后一次编辑的数据(同一个SO,SerialNumber 最大的那条)。
SELECT TOP 10 a.*
FROM mis.dbo.SOMasterHistory a WITH (NOLOCK)
WHERE EXISTS
(
SELECT MAX(SerialNumber) --zero amout when placing order
FROM mis.dbo.SOMasterHistory AS b WITH (NOLOCK)
GROUP BY b.SONumber
HAVING a.SONumber=b.SONumber
AND a.SerialNumber=MAX(SerialNumber)
)
Sample2:
GroupID SectionID CreatedTime TextValue
----------- ----------- ------------------------ -----------
1 1 2007-07-10 00:00:00.000 1-1-07-10
1 1 2007-07-11 00:00:00.000 1-1-07/11
1 2 2007-07-05 00:00:00.000 1-2-07/05
1 2 2007-07-11 00:00:00.000 1-2-07-11
1 3 2007-07-13 00:00:00.000 1-3-07-13
2 1 2007-07-10 00:00:00.000 2-1-07-10
2 1 2007-07-11 00:00:00.000 2-1-07-11
2 4 2007-07-09 00:00:00.000 2-4-07-09
其中GroupID, SectionID和CreatedTime是联合主键。当时希望写一个简单的查询,不用CURSOR、不用临时表和临时表变量,希望能得到这样的查询结果:
GroupID SectionID CreatedTime TextValue
----------- ----------- -------------------------- ---------
2 4 2007-07-09 00:00:00.000 2-4-07-09
2 1 2007-07-11 00:00:00.000 2-1-07-11
1 3 2007-07-13 00:00:00.000 1-3-07-13
1 2 2007-07-11 00:00:00.000 1-2-07-11
1 1 2007-07-11 00:00:00.000 1-1-07/11
也就是说,对于每一种(GroupID, SectionID)的组合,取出最后插入的那行。当时一下子还真没想出来怎么写。后来才找到答案的。现在这个问题是我最近使用最多的面试题。
答案如下:
SELECT *
FROM TableInterview AS t1
Where EXISTS
(
SELECT MAX(CreatedTime)
FROM TableInterview AS t2
GROUP BY GroupId, SectionId
HAVING GroupId = t1.GroupId
and SectionId = t1.SectionId
and max(CreatedTime) = t1.CreatedTime
)
Sampel1:
SerialNumber SONumber CustomerNumber SOAmount
------------ ----------- -------------- ---------------------------------------
1619648 1216 1370473 0.00
1619649 1216 1370473 0.00
1210509 1216 1370473 0.01
1621946 421648 600121 70.01
1621947 421648 600121 520.02
1210209 1645026 654728 0.00
1210212 1645026 654728 64.70
1210213 1645026 654728 64.70
1210234 1645026 654728 172.35
1210229 1645026 654728 174.48
1210512 1732653 735175 -1.99
1210240 1732653 735175 0.00
1210265 1732653 735175 1000.00
1210267 1732653 735175 5000.00
1210295 1732653 735175 10000.00
1210266 1732653 735175 10000.00
1210268 1732653 735175 100000.00
取SO# 最后一次编辑的数据(同一个SO,SerialNumber 最大的那条)。
SELECT TOP 10 a.*
FROM mis.dbo.SOMasterHistory a WITH (NOLOCK)
WHERE EXISTS
(
SELECT MAX(SerialNumber) --zero amout when placing order
FROM mis.dbo.SOMasterHistory AS b WITH (NOLOCK)
GROUP BY b.SONumber
HAVING a.SONumber=b.SONumber
AND a.SerialNumber=MAX(SerialNumber)
)
Sample2:
GroupID SectionID CreatedTime TextValue
----------- ----------- ------------------------ -----------
1 1 2007-07-10 00:00:00.000 1-1-07-10
1 1 2007-07-11 00:00:00.000 1-1-07/11
1 2 2007-07-05 00:00:00.000 1-2-07/05
1 2 2007-07-11 00:00:00.000 1-2-07-11
1 3 2007-07-13 00:00:00.000 1-3-07-13
2 1 2007-07-10 00:00:00.000 2-1-07-10
2 1 2007-07-11 00:00:00.000 2-1-07-11
2 4 2007-07-09 00:00:00.000 2-4-07-09
其中GroupID, SectionID和CreatedTime是联合主键。当时希望写一个简单的查询,不用CURSOR、不用临时表和临时表变量,希望能得到这样的查询结果:
GroupID SectionID CreatedTime TextValue
----------- ----------- -------------------------- ---------
2 4 2007-07-09 00:00:00.000 2-4-07-09
2 1 2007-07-11 00:00:00.000 2-1-07-11
1 3 2007-07-13 00:00:00.000 1-3-07-13
1 2 2007-07-11 00:00:00.000 1-2-07-11
1 1 2007-07-11 00:00:00.000 1-1-07/11
也就是说,对于每一种(GroupID, SectionID)的组合,取出最后插入的那行。当时一下子还真没想出来怎么写。后来才找到答案的。现在这个问题是我最近使用最多的面试题。
答案如下:
SELECT *
FROM TableInterview AS t1
Where EXISTS
(
SELECT MAX(CreatedTime)
FROM TableInterview AS t2
GROUP BY GroupId, SectionId
HAVING GroupId = t1.GroupId
and SectionId = t1.SectionId
and max(CreatedTime) = t1.CreatedTime
)
相关文章推荐
- 一个SQL按照类别各取一条记录查询问题
- sql实现满足某些条件的记录是否存在
- 查询分组数据指行条件满足的行的上一条记录的技巧
- mysql 给检索的条目按照某些字段分组,并合并分组后的多条记录的某列字段的值----laravel
- SQL分组查询,结果只取最新一条记录
- SQL删除某些字段重复的记录(只保留一条)
- sql获取分组后取某字段最大一条记录
- Union all的使用实现一条sql把不同表里面的数据查出来,或者按照不同的查询条件查出来的sql累加起来
- 实现函数 functionFunction,调用之后满足如下条件: 1、返回值为一个函数 f 2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', ' 3、所
- Mysql 对满足一定条件的 计数 常用的一条sql
- SQL学习笔记[7] - 怎样在一个表里筛选出每一个对象的时间最新的一条记录
- SQL 在一个时间段内每天插入一条记录
- 用一条SQL语句,将多条记录(一个字段)合并为一个
- Sql语句 表中相同的记录(某个字段)只显示一条,按照时间排序显示最大或最小
- SQL 分组后获取其中一个字段最大值的整条记录
- 【转】SQL删除某些字段重复的记录(只保留一条)
- 使用Sqlite Select返回满足条件的第一条与最后一条记录
- Sql按照字段分组,选取其他字段最值所在的行记录
- 在oracle中如何用一条sql语句把一个表中多条记录写到另外一个表中
- 使用Sqlite Select返回满足条件的第一条与最后一条记录