实现这个功能sql语句不会写

时间:2021-07-20 19:41:18
vs2010(C#),sql2012
表:table1
ID          time       卡号   分数
 1        2016-7      01       65
 2        2016-8      01       70
 3        2016-5      03       66
 4        2016-3      02       75
我想得到的是卡号相同只显示一个,分数那一列不显示,如下:
ID          time       卡号   
 1        2016-7      01            
 3        2016-5      03       
 4        2016-3      02     
怎么实现:select  ??distinct??  group by?? 不知道怎么写????

33 个解决方案

#1



select id,time,[卡号] from (
select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1
where rw = 1;


参考资料: SQLServer数据去重问题

#2


select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。

其他的我也不知道怎么提取第一行的数据。

#3


引用 1 楼 wangzhiwei0721 的回复:

select id,time,[卡号] from (
select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1
where rw = 1;


参考资料: SQLServer数据去重问题

这样是按照时间提取第一行的数据吧。

#4


引用 1 楼 wangzhiwei0721 的回复:

select id,time,[卡号] from (
select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1
where rw = 1;


参考资料: SQLServer数据去重问题

看不懂,也不行 实现这个功能sql语句不会写

#5


引用 2 楼 qq_20324803 的回复:
select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。

其他的我也不知道怎么提取第一行的数据。

我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;

#6


vs2010(C#),sql2012
表:table1
ID          time       卡号   分数
 1        2016-7      01       65
 2        2016-8      01       70
 2        2016-8      01       70
 3        2016-5      03       66
 4        2016-3      02       75
我想得到的是某个ID的数据并卡号相同只显示一个,分数那一列不显示,如下:
ID          time       卡号   
 2        2016-8      01       
 2        2016-8      01       
怎么实现:select  ??distinct??  group by?? 不知道怎么写????

#7


select min(ID),  min(time),  卡号 from table1 group by 卡号

#8


引用 7 楼 zbdzjx 的回复:
select min(ID),  min(time),  卡号 from table1 group by 卡号

+1

#9


引用 7 楼 zbdzjx 的回复:
select min(ID),  min(time),  卡号 from table1 group by 卡号


min(ID) 跟 min(time) 会产生错误匹配。

#10


引用 9 楼 sp1234 的回复:
Quote: 引用 7 楼 zbdzjx 的回复:

select min(ID),  min(time),  卡号 from table1 group by 卡号


min(ID) 跟 min(time) 会产生错误匹配。


有这种需求的,应该不会关心 具体同一分组的两条记录中数据谁家是谁家的。

#11


引用 9 楼 sp1234 的回复:
Quote: 引用 7 楼 zbdzjx 的回复:

select min(ID),  min(time),  卡号 from table1 group by 卡号


min(ID) 跟 min(time) 会产生错误匹配。


SELECT ID,time ,卡号 FROM (SELECT *,ROW_NUMBER()OVER(PARTITION BY 卡号 order by ID) as iIndex ,count(0)OVER(PARTITION BY 卡号) AS linecount  FROM table1) t WHERE iIndex=1 and ID=2 ";多加了and ID=2筛选有时出问题;不加这个条件就无问题,
这个select min(ID),  min(time),  卡号 from table1 group by 卡号;我变成select min(ID),  min(time),  卡号 from table1 where ID=2 group by 卡号;可我的ID和time在dataGridView1列名变了,

#12


引用 8 楼 angel6709 的回复:
Quote: 引用 7 楼 zbdzjx 的回复:

select min(ID),  min(time),  卡号 from table1 group by 卡号

+1

ID和time在dataGridView1列名变了,SELECT ID,time ,卡号 FROM (SELECT *,ROW_NUMBER()OVER(PARTITION BY 卡号 order by ID) as iIndex ,count(0)OVER(PARTITION BY 卡号) AS linecount  FROM table1) t WHERE iIndex=1 and ID="+n+"";这条语句有什么问题,我找不到

#13


楼主,这是最简单的SQL语句,这都不会,你的SQL有点麻烦哟,买本书先学习一下吧

#14


引用 13 楼 oysy 的回复:
楼主,这是最简单的SQL语句,这都不会,你的SQL有点麻烦哟,买本书先学习一下吧
实现这个功能sql语句不会写
我不是学这个的啊,接触这个不到两个月,公司要求我写,没办法啊!!救救场啊,大哥

#15


 你这数据也有问题啊,id都重复,怎么破

#16


前一阵给别人写的自己改改完蛋去吧,看不懂就算了。


SELECT * FROM  table x  where exists(select 1 from (select id, max(data) maxdata from table group by id) y                   

   where x.id=y.id and x.rowid< y.maxdata );
差不多这样

#17


有图有真相
实现这个功能sql语句不会写
图中是sql server优化过的,原始我是这么写的
select a.ID, a.time, a.卡号
from Table1 as a,(select min(ID) as ID, 卡号 from Table1 group by 卡号) as b 
where a.卡号 = b.卡号 and a.ID = b.ID
order by a.ID

#18


Select
    t1.Id, t1.Time, t1.卡号
from
    Table1 t1
    Left Join (select Min(Id) From Table1 group by 卡号) t2 on t1.Id = t2.Id
where 
    t2.Id Is Not Null

#19


这样子?
selec * from(select * from table1 order by 分数 desc) group by 分数

#20


这样子?
selec * from(select * from table1 order by 分数 desc)  temp group by 分数

#21


select * from table1 where ID in(select mid from (select min(ID) mid,卡号 from table1 group by 卡号) m)

#22


引用 5 楼 qq_35509243 的回复:
Quote: 引用 2 楼 qq_20324803 的回复:

select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。

其他的我也不知道怎么提取第一行的数据。

我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;


如果只是过滤重复 ID,就如 #21 楼那样的例子,写为
select tb.ID, tb.time, tb.[卡号] from (select min(ID) as ID from [your table] group by [卡号]) as ta
left join [your table] as tb
on ta.ID=tb.ID

这样的关系运算即可。SQL Server 会自动将“In”运算改为关系运算符,所以你如果了解普通的关系运算(left join、inner join)那么对 sql 的知识就更加完备。


如果要取每一个“卡号”第一次发生的准确时间,可以这样写
select ta.ID, ta.time, ta.[卡号] from (select 卡号,min(time) as time  from [your table] group by 卡号 ) as tb  
left join [your table] as ta 
on ta.卡号=tb.卡号 and ta.time=tb.time

第二个跟第一个其实非常类似。会了第一个,就很容易理解第二个查询。

#23


第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。

#24


不仅仅要求 ID 匹配而且要求 time 匹配     -->   不仅仅要求 卡号 匹配而且要求 time 匹配


用组合的条件代替主键 ID 为条件,这句是“扩展”的意思。当需要考虑的条件更多,那么你可以增加更多关联条件,而查询结构并没有什么改变,仍然是 left join 关联运算!

所以学好关系运算基本知识,你就能理解了许多稍微复杂一点的 sql 查询怎么写。而关系查询知识,其实是在学习 sql 语言之前学的,你找一本sql 语言的入门书,它们都会先教这个基础,然后才教 sql 语法。

#25


楼主加油,大家都是菜鸟过来的,这里大神多,不要着急。 实现这个功能sql语句不会写

#26


引用 22 楼 sp1234 的回复:
Quote: 引用 5 楼 qq_35509243 的回复:

Quote: 引用 2 楼 qq_20324803 的回复:

select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。

其他的我也不知道怎么提取第一行的数据。

我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;


如果只是过滤重复 ID,就如 #21 楼那样的例子,写为
select tb.ID, tb.time, tb.[卡号] from (select min(ID) as ID from [your table] group by [卡号]) as ta
left join [your table] as tb
on ta.ID=tb.ID

这样的关系运算即可。SQL Server 会自动将“In”运算改为关系运算符,所以你如果了解普通的关系运算(left join、inner join)那么对 sql 的知识就更加完备。


如果要取每一个“卡号”第一次发生的准确时间,可以这样写
select ta.ID, ta.time, ta.[卡号] from (select 卡号,min(time) as time  from [your table] group by 卡号 ) as tb  
left join [your table] as ta 
on ta.卡号=tb.卡号 and ta.time=tb.time

第二个跟第一个其实非常类似。会了第一个,就很容易理解第二个查询。

太无耻了居然抄我的。。我要告老师!

#27


引用 23 楼 sp1234 的回复:
第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。


我的数据是多台下位机发送接收的,每台下位机有一个ID号,我是想查询这个ID的数据但查询里卡号重的只显示一条,查询的只显示 ID、time、卡号这三列;select  max(id),max(time),卡号 from table1 group by 卡号    现在暂时用这个实现,你说会得到跟原始数据不搭界的查询结果;列如:
vs2010(C#),sql2012
表:table1
ID          time       卡号   分数
 1        2016-7      05       65
 2        2016-8      01       70
 2        2016-6      01       78
 2        2016-5      03       66
 4        2016-3      02       75
我想得到的是某个ID的数据并卡号相同只显示一个,分数那一列不显示,查询结果如下:
ID          time       卡号   
 2        2016-8      01       
 2        2016-5      03       

#28


引用 23 楼 sp1234 的回复:
第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。

select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
用这个会有问题吗?

#29


引用 17 楼 caojinrong 的回复:
有图有真相
实现这个功能sql语句不会写
图中是sql server优化过的,原始我是这么写的
select a.ID, a.time, a.卡号
from Table1 as a,(select min(ID) as ID, 卡号 from Table1 group by 卡号) as b 
where a.卡号 = b.卡号 and a.ID = b.ID
order by a.ID

你的ID=2不见了,
我的数据是多台下位机发送接收的,每台下位机有一个ID号,我是想查询这个ID的数据但查询里卡号重的只显示一条,查询的只显示 ID、time、卡号这三列;
select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
我用着这个,如下结果:
表:table1
ID          time       卡号   分数
 1        2016-7      05       65
 2        2016-8      01       70
 2        2016-6      01       78
 2        2016-5      03       66
 4        2016-3      02       75
查询结果如下:
ID          time       卡号   
 2        2016-8      01       
 2        2016-5      03    

#30





引用 28 楼 qq_35509243 的回复:
Quote: 引用 23 楼 sp1234 的回复:

第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。

select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
用这个会有问题吗?


select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2

这个是oracle的写法,如果是sqlserver,还是用#26这样写吧

select ta.ID, ta.time, ta.[卡号] from (select 卡号,min(time) as time  from [your table] group by 卡号 ) as tb  
left join [your table] as ta 
on ta.卡号=tb.卡号 and ta.time=tb.time

#31


引用 30 楼 xgli2002 的回复:
Quote: 引用 28 楼 qq_35509243 的回复:

Quote: 引用 23 楼 sp1234 的回复:

第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。

select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
用这个会有问题吗?


select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2

这个是oracle的写法,如果是sqlserver,还是用#26这样写吧

select ta.ID, ta.time, ta.[卡号] from (select 卡号,min(time) as time  from [your table] group by 卡号 ) as tb  
left join [your table] as ta 
on ta.卡号=tb.卡号 and ta.time=tb.time


select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
可是跟这条语句的实现功能不一样;

#32


引用 29 楼 qq_35509243 的回复:
你的ID=2不见了,
我的数据是多台下位机发送接收的,每台下位机有一个ID号,我是想查询这个ID的数据但查询里卡号重的只显示一条,查询的只显示 ID、time、卡号这三列;
select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
我用着这个,如下结果:
表:table1
ID          time       卡号   分数
 1        2016-7      05       65
 2        2016-8      01       70
 2        2016-6      01       78
 2        2016-5      03       66
 4        2016-3      02       75
查询结果如下:
ID          time       卡号   
 2        2016-8      01       
 2        2016-5      03    


看看你自己的问题中是怎么写的。

这个问题没有什么回的必要了。如果表达 DB 设计是乱的,那么结果就不用看了。

#33


看这意思需要先group by一下然后再内连接,如果你的结果集里面没有ID这一列,是仅仅group by一下就行。。。

#1



select id,time,[卡号] from (
select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1
where rw = 1;


参考资料: SQLServer数据去重问题

#2


select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。

其他的我也不知道怎么提取第一行的数据。

#3


引用 1 楼 wangzhiwei0721 的回复:

select id,time,[卡号] from (
select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1
where rw = 1;


参考资料: SQLServer数据去重问题

这样是按照时间提取第一行的数据吧。

#4


引用 1 楼 wangzhiwei0721 的回复:

select id,time,[卡号] from (
select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1
where rw = 1;


参考资料: SQLServer数据去重问题

看不懂,也不行 实现这个功能sql语句不会写

#5


引用 2 楼 qq_20324803 的回复:
select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。

其他的我也不知道怎么提取第一行的数据。

我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;

#6


vs2010(C#),sql2012
表:table1
ID          time       卡号   分数
 1        2016-7      01       65
 2        2016-8      01       70
 2        2016-8      01       70
 3        2016-5      03       66
 4        2016-3      02       75
我想得到的是某个ID的数据并卡号相同只显示一个,分数那一列不显示,如下:
ID          time       卡号   
 2        2016-8      01       
 2        2016-8      01       
怎么实现:select  ??distinct??  group by?? 不知道怎么写????

#7


select min(ID),  min(time),  卡号 from table1 group by 卡号

#8


引用 7 楼 zbdzjx 的回复:
select min(ID),  min(time),  卡号 from table1 group by 卡号

+1

#9


引用 7 楼 zbdzjx 的回复:
select min(ID),  min(time),  卡号 from table1 group by 卡号


min(ID) 跟 min(time) 会产生错误匹配。

#10


引用 9 楼 sp1234 的回复:
Quote: 引用 7 楼 zbdzjx 的回复:

select min(ID),  min(time),  卡号 from table1 group by 卡号


min(ID) 跟 min(time) 会产生错误匹配。


有这种需求的,应该不会关心 具体同一分组的两条记录中数据谁家是谁家的。

#11


引用 9 楼 sp1234 的回复:
Quote: 引用 7 楼 zbdzjx 的回复:

select min(ID),  min(time),  卡号 from table1 group by 卡号


min(ID) 跟 min(time) 会产生错误匹配。


SELECT ID,time ,卡号 FROM (SELECT *,ROW_NUMBER()OVER(PARTITION BY 卡号 order by ID) as iIndex ,count(0)OVER(PARTITION BY 卡号) AS linecount  FROM table1) t WHERE iIndex=1 and ID=2 ";多加了and ID=2筛选有时出问题;不加这个条件就无问题,
这个select min(ID),  min(time),  卡号 from table1 group by 卡号;我变成select min(ID),  min(time),  卡号 from table1 where ID=2 group by 卡号;可我的ID和time在dataGridView1列名变了,

#12


引用 8 楼 angel6709 的回复:
Quote: 引用 7 楼 zbdzjx 的回复:

select min(ID),  min(time),  卡号 from table1 group by 卡号

+1

ID和time在dataGridView1列名变了,SELECT ID,time ,卡号 FROM (SELECT *,ROW_NUMBER()OVER(PARTITION BY 卡号 order by ID) as iIndex ,count(0)OVER(PARTITION BY 卡号) AS linecount  FROM table1) t WHERE iIndex=1 and ID="+n+"";这条语句有什么问题,我找不到

#13


楼主,这是最简单的SQL语句,这都不会,你的SQL有点麻烦哟,买本书先学习一下吧

#14


引用 13 楼 oysy 的回复:
楼主,这是最简单的SQL语句,这都不会,你的SQL有点麻烦哟,买本书先学习一下吧
实现这个功能sql语句不会写
我不是学这个的啊,接触这个不到两个月,公司要求我写,没办法啊!!救救场啊,大哥

#15


 你这数据也有问题啊,id都重复,怎么破

#16


前一阵给别人写的自己改改完蛋去吧,看不懂就算了。


SELECT * FROM  table x  where exists(select 1 from (select id, max(data) maxdata from table group by id) y                   

   where x.id=y.id and x.rowid< y.maxdata );
差不多这样

#17


有图有真相
实现这个功能sql语句不会写
图中是sql server优化过的,原始我是这么写的
select a.ID, a.time, a.卡号
from Table1 as a,(select min(ID) as ID, 卡号 from Table1 group by 卡号) as b 
where a.卡号 = b.卡号 and a.ID = b.ID
order by a.ID

#18


Select
    t1.Id, t1.Time, t1.卡号
from
    Table1 t1
    Left Join (select Min(Id) From Table1 group by 卡号) t2 on t1.Id = t2.Id
where 
    t2.Id Is Not Null

#19


这样子?
selec * from(select * from table1 order by 分数 desc) group by 分数

#20


这样子?
selec * from(select * from table1 order by 分数 desc)  temp group by 分数

#21


select * from table1 where ID in(select mid from (select min(ID) mid,卡号 from table1 group by 卡号) m)

#22


引用 5 楼 qq_35509243 的回复:
Quote: 引用 2 楼 qq_20324803 的回复:

select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。

其他的我也不知道怎么提取第一行的数据。

我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;


如果只是过滤重复 ID,就如 #21 楼那样的例子,写为
select tb.ID, tb.time, tb.[卡号] from (select min(ID) as ID from [your table] group by [卡号]) as ta
left join [your table] as tb
on ta.ID=tb.ID

这样的关系运算即可。SQL Server 会自动将“In”运算改为关系运算符,所以你如果了解普通的关系运算(left join、inner join)那么对 sql 的知识就更加完备。


如果要取每一个“卡号”第一次发生的准确时间,可以这样写
select ta.ID, ta.time, ta.[卡号] from (select 卡号,min(time) as time  from [your table] group by 卡号 ) as tb  
left join [your table] as ta 
on ta.卡号=tb.卡号 and ta.time=tb.time

第二个跟第一个其实非常类似。会了第一个,就很容易理解第二个查询。

#23


第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。

#24


不仅仅要求 ID 匹配而且要求 time 匹配     -->   不仅仅要求 卡号 匹配而且要求 time 匹配


用组合的条件代替主键 ID 为条件,这句是“扩展”的意思。当需要考虑的条件更多,那么你可以增加更多关联条件,而查询结构并没有什么改变,仍然是 left join 关联运算!

所以学好关系运算基本知识,你就能理解了许多稍微复杂一点的 sql 查询怎么写。而关系查询知识,其实是在学习 sql 语言之前学的,你找一本sql 语言的入门书,它们都会先教这个基础,然后才教 sql 语法。

#25


楼主加油,大家都是菜鸟过来的,这里大神多,不要着急。 实现这个功能sql语句不会写

#26


引用 22 楼 sp1234 的回复:
Quote: 引用 5 楼 qq_35509243 的回复:

Quote: 引用 2 楼 qq_20324803 的回复:

select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。

其他的我也不知道怎么提取第一行的数据。

我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;


如果只是过滤重复 ID,就如 #21 楼那样的例子,写为
select tb.ID, tb.time, tb.[卡号] from (select min(ID) as ID from [your table] group by [卡号]) as ta
left join [your table] as tb
on ta.ID=tb.ID

这样的关系运算即可。SQL Server 会自动将“In”运算改为关系运算符,所以你如果了解普通的关系运算(left join、inner join)那么对 sql 的知识就更加完备。


如果要取每一个“卡号”第一次发生的准确时间,可以这样写
select ta.ID, ta.time, ta.[卡号] from (select 卡号,min(time) as time  from [your table] group by 卡号 ) as tb  
left join [your table] as ta 
on ta.卡号=tb.卡号 and ta.time=tb.time

第二个跟第一个其实非常类似。会了第一个,就很容易理解第二个查询。

太无耻了居然抄我的。。我要告老师!

#27


引用 23 楼 sp1234 的回复:
第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。


我的数据是多台下位机发送接收的,每台下位机有一个ID号,我是想查询这个ID的数据但查询里卡号重的只显示一条,查询的只显示 ID、time、卡号这三列;select  max(id),max(time),卡号 from table1 group by 卡号    现在暂时用这个实现,你说会得到跟原始数据不搭界的查询结果;列如:
vs2010(C#),sql2012
表:table1
ID          time       卡号   分数
 1        2016-7      05       65
 2        2016-8      01       70
 2        2016-6      01       78
 2        2016-5      03       66
 4        2016-3      02       75
我想得到的是某个ID的数据并卡号相同只显示一个,分数那一列不显示,查询结果如下:
ID          time       卡号   
 2        2016-8      01       
 2        2016-5      03       

#28


引用 23 楼 sp1234 的回复:
第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。

select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
用这个会有问题吗?

#29


引用 17 楼 caojinrong 的回复:
有图有真相
实现这个功能sql语句不会写
图中是sql server优化过的,原始我是这么写的
select a.ID, a.time, a.卡号
from Table1 as a,(select min(ID) as ID, 卡号 from Table1 group by 卡号) as b 
where a.卡号 = b.卡号 and a.ID = b.ID
order by a.ID

你的ID=2不见了,
我的数据是多台下位机发送接收的,每台下位机有一个ID号,我是想查询这个ID的数据但查询里卡号重的只显示一条,查询的只显示 ID、time、卡号这三列;
select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
我用着这个,如下结果:
表:table1
ID          time       卡号   分数
 1        2016-7      05       65
 2        2016-8      01       70
 2        2016-6      01       78
 2        2016-5      03       66
 4        2016-3      02       75
查询结果如下:
ID          time       卡号   
 2        2016-8      01       
 2        2016-5      03    

#30





引用 28 楼 qq_35509243 的回复:
Quote: 引用 23 楼 sp1234 的回复:

第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。

select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
用这个会有问题吗?


select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2

这个是oracle的写法,如果是sqlserver,还是用#26这样写吧

select ta.ID, ta.time, ta.[卡号] from (select 卡号,min(time) as time  from [your table] group by 卡号 ) as tb  
left join [your table] as ta 
on ta.卡号=tb.卡号 and ta.time=tb.time

#31


引用 30 楼 xgli2002 的回复:
Quote: 引用 28 楼 qq_35509243 的回复:

Quote: 引用 23 楼 sp1234 的回复:

第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。

如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。

select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
用这个会有问题吗?


select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2

这个是oracle的写法,如果是sqlserver,还是用#26这样写吧

select ta.ID, ta.time, ta.[卡号] from (select 卡号,min(time) as time  from [your table] group by 卡号 ) as tb  
left join [your table] as ta 
on ta.卡号=tb.卡号 and ta.time=tb.time


select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
可是跟这条语句的实现功能不一样;

#32


引用 29 楼 qq_35509243 的回复:
你的ID=2不见了,
我的数据是多台下位机发送接收的,每台下位机有一个ID号,我是想查询这个ID的数据但查询里卡号重的只显示一条,查询的只显示 ID、time、卡号这三列;
select id,time,[卡号] from (select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1 where rw = 1 and id =2
我用着这个,如下结果:
表:table1
ID          time       卡号   分数
 1        2016-7      05       65
 2        2016-8      01       70
 2        2016-6      01       78
 2        2016-5      03       66
 4        2016-3      02       75
查询结果如下:
ID          time       卡号   
 2        2016-8      01       
 2        2016-5      03    


看看你自己的问题中是怎么写的。

这个问题没有什么回的必要了。如果表达 DB 设计是乱的,那么结果就不用看了。

#33


看这意思需要先group by一下然后再内连接,如果你的结果集里面没有ID这一列,是仅仅group by一下就行。。。