+ -
当前位置:首页 → 问答吧 → SQL查询,难倒我了,谁能帮帮忙,谢了

SQL查询,难倒我了,谁能帮帮忙,谢了

时间:2011-11-09

来源:互联网

有这样的数据库表,存储每次设备发送的故障信息
EQUIP_ID,ERROR_CODE,UPDATE_TIME
001, 1, 2011-10-22 08:01:00
001, 1, 2011-10-22 08:01:00
002, 2, 2011-10-22 08:00:00
002, 2, 2011-10-22 07:50:00
002, 1, 2011-10-22 07:45:00
002, 1, 2011-10-22 07:40:00
002, 1, 2011-10-22 07:30:00

我想查询出这样的结果,过滤掉重复上传的信息,保留每个设备每个故障最新(最后)上传的的一条。
EQUIP_ID,ERROR_CODE,UPDATE_TIME
001, 1, 2011-10-22 08:01:00
002, 2, 2011-10-22 08:00:00
002, 1, 2011-10-22 07:45:00

作者: harry960   发布时间: 2011-11-09

select m.* from tb m where not exists(select 1 from tb n where n.EQUIP_ID = m.EQUIP_ID and n.UPDATE_TIME > m.UPDATE_TIME)

select m.* from tb m where m.UPDATE_TIME = (select max(UPDATE_TIME) from tb n where n.EQUIP_ID = m.EQUIP_ID)

作者: dawugui   发布时间: 2011-11-09

也可以用row_number函数
SQL code
SELECT EQUIP_ID, ERROR_CODE, UPDATE_TIME
  FROM (SELECT EQUIP_ID,
               ERROR_CODE,
               UPDATE_TIME,
               ROW_MUNBER() OVER(PARTITION BY EQUIP_ID, ERROR_CODE ORDER BY UPDATE_TIME DESC) RN
          FROM TAB1)
 WHERE RN = 1

作者: tx2730   发布时间: 2011-11-09

SQL code
select EQUIP_ID,ERROR_CODE,UPDATE_TIME
(
select EQUIP_ID,ERROR_CODE,UPDATE_TIME,
row_number()over(partition by EQUIP_ID,ERROR_CODE,UPDATE_TIME order by update_time desc) rn
from tb
)where rn=1

作者: cosio   发布时间: 2011-11-09

SQL code
select EQUIP_ID,ERROR_CODE,UPDATE_TIME
(
select EQUIP_ID,ERROR_CODE,UPDATE_TIME,
row_number()over(partition by EQUIP_ID,ERROR_CODE order by update_time desc) rn
from tb
)where rn=1

作者: cosio   发布时间: 2011-11-09

用 row_number 函数比较好

作者: opps_zhou   发布时间: 2011-11-09

简单分组就可以做到。
SQL code

SELECT equipId, errorcode, MAX(updatetime) FROM t3
GROUP BY equipid, errorcode;

作者: LuiseRADL   发布时间: 2011-11-09

你的需求 应该一个group by 就可以了
SQL code

SELECT t.equip_id,error_code,MAX(update_time) FROM t
GROUP BY t.equip_id,t.error_code
ORDER BY t.equip_id,t.error_code

作者: hudingchen   发布时间: 2011-11-09

up

引用 6 楼 luiseradl 的回复:
简单分组就可以做到。

SQL code

SELECT equipId, errorcode, MAX(updatetime) FROM t3
GROUP BY equipid, errorcode;

作者: BenChiM888   发布时间: 2011-11-09

頂個 。。。

作者: a120255857   发布时间: 2011-11-09

保留每个设备每个故障最新(最后)上传的的一条。

现在才看清楚,如楼上说的,其实简单分组即可.

作者: dawugui   发布时间: 2011-11-09

不好意思,表数据不全,让大家误解了,直接group by不可以。
修改后如下:

有这样的数据库表,存储每次设备发送的故障信息
EQUIP_ID,ERROR_CODE,UPDATE_TIME
001, 1, 2011-10-22 08:10:00
001, 1, 2011-10-22 08:02:00
002, 2, 2011-10-22 08:00:00
002, 2, 2011-10-22 07:50:00
002, 1, 2011-10-22 07:45:00
002, 1, 2011-10-22 07:40:00
002, 1, 2011-10-22 07:30:00
001, 1, 2011-10-22 07:10:00
001, 1, 2011-10-22 07:08:00

我想查询出这样的结果,过滤掉重复上传的信息,保留每个设备每个故障最早上传的的一条。
EQUIP_ID,ERROR_CODE,UPDATE_TIME
001, 1, 2011-10-22 08:02:00
002, 2, 2011-10-22 07:50:00
002, 1, 2011-10-22 07:30:00
001, 1, 2011-10-22 07:08:00

作者: harry960   发布时间: 2011-11-09

EQUIP_ID,ERROR_CODE,UPDATE_TIME
001, 1, 2011-10-22 08:02:00
002, 2, 2011-10-22 07:50:00
002, 1, 2011-10-22 07:30:00
001, 1, 2011-10-22 07:08:00
怎么还有两条呢???

不能用Group by就用row_number试试看
SQL code
SELECT EQUIP_ID, ERROR_CODE, UPDATE_TIME
  FROM (SELECT EQUIP_ID,
               ERROR_CODE,
               UPDATE_TIME,
               ROW_MUNBER() OVER(PARTITION BY EQUIP_ID, ERROR_CODE ORDER BY UPDATE_TIME DESC) RN
          FROM TAB1)
 WHERE RN = 1

作者: tx2730   发布时间: 2011-11-09

设备先后发送2次故障1,再发5次故障2,又发2次故障1,
这个设备的总故障数量是3次,不是2次,也不是9次。

作者: harry960   发布时间: 2011-11-09

我认为数据在DB里面是无序的,如果是这样的话必须再加一列来区分这是第几次才行,否则怎么知道数据是第几次故障的

作者: tx2730   发布时间: 2011-11-09

设备通过传感器每隔一段时间就上报状态,只是如实的记录状态

作者: harry960   发布时间: 2011-11-09

EQUIP_ID,ERROR_CODE,UPDATE_TIME
001, 1, 2011-10-22 08:10:00
001, 1, 2011-10-22 08:02:00
002, 2, 2011-10-22 08:00:00
002, 2, 2011-10-22 07:50:00
002, 1, 2011-10-22 07:45:00
002, 1, 2011-10-22 07:40:00
002, 1, 2011-10-22 07:30:00
001, 1, 2011-10-22 07:10:00
001, 1, 2011-10-22 07:08:00

按照你的需求:每个设备每个故障最早上传的的一条。
上面的4条记录不是同一个设备同一个故障吗?你要得结果是怎么变成下面的?


EQUIP_ID,ERROR_CODE,UPDATE_TIME
001, 1, 2011-10-22 08:02:00
002, 2, 2011-10-22 07:50:00
002, 1, 2011-10-22 07:30:00
001, 1, 2011-10-22 07:08:00

作者: hudingchen   发布时间: 2011-11-09

如果不是业务逻辑有问题就是表结构有问题,这样目前没办法实现lz的需求.
不能依赖数据本身的顺序,因为数据本身是无序的.

作者: tx2730   发布时间: 2011-11-09

引用 16 楼 hudingchen 的回复:
上面的4条记录不是同一个设备同一个故障吗?你要得结果是怎么变成下面的?

你说的对,手写内容就是麻烦,把数据库的粘贴过来又太长不便于分析。
改成下边的就是3个状态了。
001, 1, 2011-10-22 08:10:00
001, 1, 2011-10-22 08:02:00
001, 2, 2011-10-22 07:50:00
001, 2, 2011-10-22 07:40:00
001, 1, 2011-10-22 07:10:00
001, 1, 2011-10-22 07:08:00

作者: harry960   发布时间: 2011-11-09

001, 1, 2011-10-22 08:10:00
001, 1, 2011-10-22 08:02:00
001, 2, 2011-10-22 07:50:00
001, 2, 2011-10-22 07:40:00
001, 1, 2011-10-22 07:10:00
001, 1, 2011-10-22 07:08:00

三个大写就是你要的结果吧!

作者: cosio   发布时间: 2011-11-09

你这是要统计连续出现故障的最新一条吗?
比如先出现2次故障1(A,B),再出现3次故障2(C,D,E),然后再出现2次故障1(F,G),
你时间要统计的是B,E,G,不知道这样理解是否正确!

作者: jg_huang   发布时间: 2011-11-09

SQL code

--是否这样的
----------------------------->
SQL> 
SQL> with t as (
  2  select  '001' EQUIP_ID,1 ERROR_CODE,'2011-10-22 08:01:00' UPDATE_TIME from dual
  3  union all
  4  select  '001' EQUIP_ID,1 ERROR_CODE,'2011-10-22 08:01:00' UPDATE_TIME from dual
  5  union all
  6  select  '002' EQUIP_ID,2 ERROR_CODE,'2011-10-22 08:00:00' UPDATE_TIME from dual
  7  union all
  8  select  '002' EQUIP_ID,2 ERROR_CODE,'2011-10-22 07:50:00' UPDATE_TIME from dual
  9  union all
 10  select  '002' EQUIP_ID,1 ERROR_CODE,'2011-10-22 07:45:00' UPDATE_TIME from dual
 11  union all
 12  select  '002' EQUIP_ID,1 ERROR_CODE,'2011-10-22 07:40:00' UPDATE_TIME from dual
 13  union all
 14  select  '002' EQUIP_ID,1 ERROR_CODE,'2011-10-22 07:30:00' UPDATE_TIME from dual
 15  union all
 16  select  '001' EQUIP_ID,1 ERROR_CODE,'2011-10-22 07:10:00' UPDATE_TIME from dual
 17  union all
 18  select  '001' EQUIP_ID,1 ERROR_CODE,'2011-10-22 07:08:00' UPDATE_TIME from dual)
 19  SELECT EQUIP_ID, ERROR_CODE, MIN(UPDATE_TIME) FROM t
 20  GROUP BY EQUIP_ID, ERROR_CODE;
 
EQUIP_ID ERROR_CODE MIN(UPDATE_TIME)
-------- ---------- -------------------
002               2 2011-10-22 07:50:00
002               1 2011-10-22 07:30:00
001               1 2011-10-22 07:08:00
 
SQL> 

作者: xl_smlie   发布时间: 2011-11-09