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

目的为学习 2016-08-31 11:26:05
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?? 不知道怎么写????
...全文
624 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不仅仅要求 ID 匹配而且要求 time 匹配 --> 不仅仅要求 卡号 匹配而且要求 time 匹配 用组合的条件代替主键 ID 为条件,这句是“扩展”的意思。当需要考虑的条件更多,那么你可以增加更多关联条件,而查询结构并没有什么改变,仍然是 left join 关联运算! 所以学好关系运算基本知识,你就能理解了许多稍微复杂一点的 sql 查询怎么写。而关系查询知识,其实是在学习 sql 语言之前学的,你找一本sql 语言的入门书,它们都会先教这个基础,然后才教 sql 语法。
gengchenhui 2016-09-01
  • 打赏
  • 举报
回复
看这意思需要先group by一下然后再内连接,如果你的结果集里面没有ID这一列,是仅仅group by一下就行。。。
  • 打赏
  • 举报
回复
引用 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 设计是乱的,那么结果就不用看了。
目的为学习 2016-09-01
  • 打赏
  • 举报
回复
引用 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
用这个会有问题吗?[/quote]
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
[/quote]
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
可是跟这条语句的实现功能不一样;
dddsdfsd1 2016-09-01
  • 打赏
  • 举报
回复
引用 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
用这个会有问题吗?[/quote]
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
目的为学习 2016-09-01
  • 打赏
  • 举报
回复
引用 17 楼 caojinrong 的回复:
有图有真相 图中是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
目的为学习 2016-09-01
  • 打赏
  • 举报
回复
引用 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
用这个会有问题吗?
目的为学习 2016-09-01
  • 打赏
  • 举报
回复
引用 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
风吹腚腚凉 2016-09-01
  • 打赏
  • 举报
回复
引用 22 楼 sp1234 的回复:
[quote=引用 5 楼 qq_35509243 的回复:] [quote=引用 2 楼 qq_20324803 的回复:] select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。 其他的我也不知道怎么提取第一行的数据。
我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;[/quote] 如果只是过滤重复 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
第二个跟第一个其实非常类似。会了第一个,就很容易理解第二个查询。[/quote] 太无耻了居然抄我的。。我要告老师!
楠小颜 2016-09-01
  • 打赏
  • 举报
回复
楼主加油,大家都是菜鸟过来的,这里大神多,不要着急。
目的为学习 2016-08-31
  • 打赏
  • 举报
回复
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?? 不知道怎么写????
目的为学习 2016-08-31
  • 打赏
  • 举报
回复
引用 2 楼 qq_20324803 的回复:
select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。 其他的我也不知道怎么提取第一行的数据。
我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;
目的为学习 2016-08-31
  • 打赏
  • 举报
回复
引用 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数据去重问题
看不懂,也不行
摇撼大地 2016-08-31
  • 打赏
  • 举报
回复
引用 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数据去重问题
这样是按照时间提取第一行的数据吧。
摇撼大地 2016-08-31
  • 打赏
  • 举报
回复
select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。 其他的我也不知道怎么提取第一行的数据。
王志威丶 2016-08-31
  • 打赏
  • 举报
回复

select id,time,[卡号] from (
select *,ROW_NUMBER() over (partition by [卡号] order by [time] desc)  as rw
from [table1] ) as t1
where rw = 1;
参考资料:SQLServer数据去重问题
  • 打赏
  • 举报
回复
第二个查询是第一个查询的扩展,也就是说,在进行关心运算时,不仅仅要求 ID 匹配而且要求 time 匹配,才是结果。这能得到准确的结果。 如果是 select min(time),min(ID) 那就会得到跟原始数据不搭界的查询结果了。
  • 打赏
  • 举报
回复
引用 5 楼 qq_35509243 的回复:
[quote=引用 2 楼 qq_20324803 的回复:] select first( ID),first(TIme),卡号 from table1 group by 卡号.但是这种语法只能access里面用。 其他的我也不知道怎么提取第一行的数据。
我只是想数据去重;要提取数据吗,作为dataGridView1的DataSource ;[/quote] 如果只是过滤重复 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
第二个跟第一个其实非常类似。会了第一个,就很容易理解第二个查询。
玄星子 2016-08-31
  • 打赏
  • 举报
回复
select * from table1 where ID in(select mid from (select min(ID) mid,卡号 from table1 group by 卡号) m)
MOKER2014 2016-08-31
  • 打赏
  • 举报
回复
这样子?
selec * from(select * from table1 order by 分数 desc)  temp group by 分数
加载更多回复(13)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧