当前位置: 代码迷 >> Sql Server >> SQLServer数据库中,有些复杂的查询,已经弄了2天了,头转不过来了,麻烦各位看看帮下忙
  详细解决方案

SQLServer数据库中,有些复杂的查询,已经弄了2天了,头转不过来了,麻烦各位看看帮下忙

热度:99   发布时间:2016-04-24 09:51:27.0
SQLServer数据库中,有点复杂的查询,已经弄了2天了,头转不过来了,麻烦各位看看帮下忙。
前提,
1,一张表中,暂时取表名 Tb_name1
2, 多个字段,多条记录。 比如说year,month,id,name四个字段,name存储很多人的名字,其中name为同一个人的名字有多条数据
3,获取不同name的最小的year和最小的month的其中的id字段


比如说:
       year    month   id  name
     2014    10          1     a
     2014     9           2     a
     2013     12         3    a
     2013     1           4     a
     2013     2           5     a   
     2014    10          6     b
     2015     9           7     b
     2012     12         8    b
     2012     1           9     b
     2012     2          10    b   
     2014    10         11    b
     2015     11        12     b
     2013     12        13    c
     2013     1          14     c
     2013     2          15     c   

 好了, 我要查出每个人的最小year和最小month的id, 像下面一样
       year    month   id  name
       2013     1           4     a
       2012     1           9     b
       2013     1          14     c


在线等啊。。。急啊。  已经晕了,我。。。
------解决思路----------------------
;WITH CTE AS(
SELECT ROW_NUMBER()OVER(PARTITION BY[name]ORDER BY[year],[month])RN,*FROM Tb_name1
)
SELECT[year],[month],[id],[name]FROM CTE WHERE RN=1

SQL2005+有效
你参考一下
------解决思路----------------------
select * from(
SELECT Tb_name.*,ROW_NUMBER()OVER(PARTITION BY NAME ORDER BY YEAR,MONTH) RN FROM Tb_name1
) A where rn=1

------解决思路----------------------
的确被你的描述绕晕。看到你的结果 焕然大悟啊。
select * from (select *,row_number()over(partition by name order by year ,month) as n from Tb_name1)
 as t
where t.n=1
------解决思路----------------------


use tempdb

create table test([year] int,[month] int,id int ,name varchar(10))
insert into test
select 2014,    10 ,         1  ,   'a' union all
select 2014,     9 ,          2 ,    'a' union all
select 2013,     12,         3  ,  'a' union all
select 2013,     1 ,          4 ,    'a' union all
select 2013,     2 ,          5 ,    'a'  union all  
select 2014,    10 ,         6  ,   'b' union all
select 2015,     9 ,          7 ,   'b' union all
select 2012,     12,         8  ,  'b' union all
  相关解决方案