最大值子查询

时间:2022-06-19 15:11:07
小弟新学 接到一个任务 大体描述是这样的
每天的每个小时有几百条数据存入数据库     表项可以理解为这样    id date hour data
现在需要根据date找出每个小时data的最大值的记录返回
我的想法是子查询找到max的记录然后返回id给上层 但是实在想不出怎么实现
请各位多多指点

14 个解决方案

#1


select * from tab a
where not exists (
select 1 from tab b
where b.[date] = a.[date]
and b.data > a.data
)

#2


select * from tb t 
where data=(select max(data) from tb where date=t.date and hour=t.hour 
group by date,hour)

#3


引用 2 楼 szm341 的回复:
select * from tb t 
where data=(select max(data) from tb where date=t.date and hour=t.hour 
group by date,hour)

这样内外层用data匹配的话出来的数据特殊情况下有可能是不严谨的吧 

#4


http://bbs.csdn.net/topics/200039629

#5


引用 3 楼 fanweiyang1 的回复:
这样内外层用data匹配的话出来的数据特殊情况下有可能是不严谨的吧

什么样的特殊情况呢?这是个相关子查询啊

#6


引用 5 楼 szm341 的回复:
引用 3 楼 fanweiyang1 的回复:这样内外层用data匹配的话出来的数据特殊情况下有可能是不严谨的吧
什么样的特殊情况呢?这是个相关子查询啊

如果这种情况:
同一天 1:00+ 这个小时里面有两个数据 85 55
       2:00+这个小时里面有两个数据 55 45
这样的话把1:00+里面那个55的数据也拿出来了吧

#7


引用 6 楼 fanweiyang1 的回复:
同一天 1:00+ 这个小时里面有两个数据 85 55
       2:00+这个小时里面有两个数据 55 45
这样的话把1:00+里面那个55的数据也拿……


怎么会呢,相关子查询,外部查询与内部子查询是有关联条件的,
date=t.date and hour=t.hour 
也就是当前时间消失内,只返回一个最大值data的数据,不然写这个关联条件干嘛

#8


引用 7 楼 szm341 的回复:
引用 6 楼 fanweiyang1 的回复:同一天 1:00+ 这个小时里面有两个数据 85 55
       2:00+这个小时里面有两个数据 55 45
这样的话把1:00+里面那个55的数据也拿……

怎么会呢,相关子查询,外部查询与内部子查询是有关联条件的,
date=t.date and hour=t.hour 
也就是当前时间消失内,只返回一个……

我照你的方法做了个实验...结果数据一条都没有过滤掉 跟select * from出的数据一样的...

#9


引用 4 楼 fcuandy 的回复:
http://bbs.csdn.net/topics/200039629

你好 我看了你的帖子 觉得你写的第一条描述的跟我要的应该是差不多的 但是我找着写了下还是得不到想要的结果 我的想法应该是结果中只有24条数据 每一小时找出一个最大值 但是我想不明白怎么改
SELECT a.* FROM ta a
    WHERE NOT EXISTS(SELECT 1 FROM ta WHERE cid=a.cid AND id<a.id)

#10


引用 7 楼 szm341 的回复:
引用 6 楼 fanweiyang1 的回复:同一天 1:00+ 这个小时里面有两个数据 85 55
       2:00+这个小时里面有两个数据 55 45
这样的话把1:00+里面那个55的数据也拿……

怎么会呢,相关子查询,外部查询与内部子查询是有关联条件的,
date=t.date and hour=t.hour 
也就是当前时间消失内,只返回一个……

没有过滤掉任何记录  这是哪里错了

#11


引用 10 楼 fanweiyang1 的回复:
没有过滤掉任何记录  这是哪里错了 

把你写的语句贴出来,是不是表别名t引用错了

#12


最大值子查询

select * from tb t
cross apply(select maxdata=max(data) from tb where date=t.date and hour=t.hour)tt

#13


楼上的代码错了,

select *,最大值=max(data) over(partition by date,hour) from tb

#14



select *,maxdata=max(data) over(partition by tb.date,tb.hour) from tb

#1


select * from tab a
where not exists (
select 1 from tab b
where b.[date] = a.[date]
and b.data > a.data
)

#2


select * from tb t 
where data=(select max(data) from tb where date=t.date and hour=t.hour 
group by date,hour)

#3


引用 2 楼 szm341 的回复:
select * from tb t 
where data=(select max(data) from tb where date=t.date and hour=t.hour 
group by date,hour)

这样内外层用data匹配的话出来的数据特殊情况下有可能是不严谨的吧 

#4


http://bbs.csdn.net/topics/200039629

#5


引用 3 楼 fanweiyang1 的回复:
这样内外层用data匹配的话出来的数据特殊情况下有可能是不严谨的吧

什么样的特殊情况呢?这是个相关子查询啊

#6


引用 5 楼 szm341 的回复:
引用 3 楼 fanweiyang1 的回复:这样内外层用data匹配的话出来的数据特殊情况下有可能是不严谨的吧
什么样的特殊情况呢?这是个相关子查询啊

如果这种情况:
同一天 1:00+ 这个小时里面有两个数据 85 55
       2:00+这个小时里面有两个数据 55 45
这样的话把1:00+里面那个55的数据也拿出来了吧

#7


引用 6 楼 fanweiyang1 的回复:
同一天 1:00+ 这个小时里面有两个数据 85 55
       2:00+这个小时里面有两个数据 55 45
这样的话把1:00+里面那个55的数据也拿……


怎么会呢,相关子查询,外部查询与内部子查询是有关联条件的,
date=t.date and hour=t.hour 
也就是当前时间消失内,只返回一个最大值data的数据,不然写这个关联条件干嘛

#8


引用 7 楼 szm341 的回复:
引用 6 楼 fanweiyang1 的回复:同一天 1:00+ 这个小时里面有两个数据 85 55
       2:00+这个小时里面有两个数据 55 45
这样的话把1:00+里面那个55的数据也拿……

怎么会呢,相关子查询,外部查询与内部子查询是有关联条件的,
date=t.date and hour=t.hour 
也就是当前时间消失内,只返回一个……

我照你的方法做了个实验...结果数据一条都没有过滤掉 跟select * from出的数据一样的...

#9


引用 4 楼 fcuandy 的回复:
http://bbs.csdn.net/topics/200039629

你好 我看了你的帖子 觉得你写的第一条描述的跟我要的应该是差不多的 但是我找着写了下还是得不到想要的结果 我的想法应该是结果中只有24条数据 每一小时找出一个最大值 但是我想不明白怎么改
SELECT a.* FROM ta a
    WHERE NOT EXISTS(SELECT 1 FROM ta WHERE cid=a.cid AND id<a.id)

#10


引用 7 楼 szm341 的回复:
引用 6 楼 fanweiyang1 的回复:同一天 1:00+ 这个小时里面有两个数据 85 55
       2:00+这个小时里面有两个数据 55 45
这样的话把1:00+里面那个55的数据也拿……

怎么会呢,相关子查询,外部查询与内部子查询是有关联条件的,
date=t.date and hour=t.hour 
也就是当前时间消失内,只返回一个……

没有过滤掉任何记录  这是哪里错了

#11


引用 10 楼 fanweiyang1 的回复:
没有过滤掉任何记录  这是哪里错了 

把你写的语句贴出来,是不是表别名t引用错了

#12


最大值子查询

select * from tb t
cross apply(select maxdata=max(data) from tb where date=t.date and hour=t.hour)tt

#13


楼上的代码错了,

select *,最大值=max(data) over(partition by date,hour) from tb

#14



select *,maxdata=max(data) over(partition by tb.date,tb.hour) from tb