SQL优化

机台    上传时间    状态

1          2:00            正常

1          2:10            调机

1          3:00            正常

1          3:10            调机

2          12:00            正常

2          1:10            调机

3          2:00            正常

3          3:10            调机


统计结果为

时间      机台数量    正常      调机

12:00          1          1/1      0/1

1:00            1          0/1      1/1

2:00            3          1/3       2/3

3:00            3           0/3       3/3 


汇总计算的其实是这个时间点往后推一个小时之前,上传的机台数量,状态取该段时间最新一次上传的状态做计算。

简单算法就是先计算出

1点之前(不包括1点)的汇总再

union

2点之前(不包括2点)的汇总再

……

但是这种算法感觉有点不好,我要汇总多少条数据就得union多少次。有没有什么比较好的优化方式

             

wangyr1 发布于 2019-10-9 17:23
1min目标场景问卷 立即参与
回答问题
悬赏:8 F币 4人赏过 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共5回答
最佳回答
0
hippomenes157Lv3见习互助
发布于2019-10-10 12:03(编辑于 2019-10-10 16:41)

上边好像都不对 我下午试下

-------------------------------------------------------------

有几个点不知道理解的对不对

1.机台是指设备号

2.1:00-3:00是指下午

3.时间的12:00 表示上传时间12:00-12:59


考虑了机台在一天内可能有这样的情况:先有上传数据记录,之后又在某个 整个小时中都无上传数据的情况

select 时间,count(machine) 机台数量,
sum(case when status='正常' then 1 else 0 end)||'/'||count(machine) 正常,
sum(case when status='调机' then 1 else 0 end)||'/'||count(machine) 调机 from
(
select a.时间,
row_number() over(partition by a.时间,b.machine order by b.time desc) rn
,b.machine
,b.status
from
(select  distinct substr(time, 1, 2)||':00' 时间
from ttt) a
left join
ttt b
on substr(b.time, 1, 2)<=a.时间)
where rn=1
group by 时间
order by 时间;

最佳回答
0
张洪威Lv6高级互助
发布于2019-10-9 17:43

select CONCAT(aa.时间,':00') as 时间 ,aa.机台数量,bb.正常,aa.机台数量-bb.正常 as '调机',CONCAT(bb.正常,'/',aa.机台数量)  as '正常' from 

(select left(sj,LOCATE(":",sj)-1) as '时间',count(1) as '机台数量' from test1

group by left(sj,LOCATE(":",sj)-1)) aa

left join (select left(sj,LOCATE(":",sj)-1) as '时间',count(1) as '正常' from test1 where zt='正常'

group by left(sj,LOCATE(":",sj)-1)) bb on aa.时间=bb.时间


照这个sql试试,剩下null判断,调机的1/1这种自己加下就行。


image.png

  • wangyr1 wangyr1(提问者) 这个结果好像就不对了,而且不好意思,我没说清楚公司用的是sql server 2008
    2019-10-11 10:03 
最佳回答
0
凌建Lv7高级互助
发布于2019-10-10 08:40

sqlserver为例,直接使用case when 判断增加状态字段

select 

case when datepart(hh,上传时间)<2 then '正常',

when datepart(hh,上传时间)<2 then ''  ...  end 状态


然后帆软里直接进行汇总统计就好

最佳回答
0
axingLv6专家互助
发布于2019-10-10 09:49
select 
cast(datepart(hh,上传时间) as varchar)+':00' 时间, 
count(1) as 机台数量,
cast(sum(case when 状态='正常' then 1 else 0 end) as varchar)+'/'+cast (count(1) as varchar) as 正常,
cast(sum(case when 状态='调机' then 1 else 0 end) as varchar)+'/'+cast (count(1) as varchar) as 调机
from temp
group by 
datepart(hh,上传时间)

image.png

  • wangyr1 wangyr1(提问者) 你这样汇总的其实只是按整点分类后的数据,要的其实是每个整点之前,各个机台最新测试结果的汇总
    2019-10-11 10:07 
最佳回答
0
qhlLv6中级互助
发布于2019-10-10 17:49

用oracle测试如下SQL可以实现:

select substr(t.上传时间,1,instr(t.上传时间,':')-1)||':00' 时间,

           count(t.机台) 机台数量,

           sum(case when t.状态='正常' then 1 else 0 end )||'/'||count(t.机台) 正常,

           sum(case when t.状态='调机' then 1 else 0 end )||'/'||count(t.机台) 调机         

from TIME_TESTSQL t

group by substr(t.上传时间,1,instr(t.上传时间,':')-1)||':00'

order by substr(t.上传时间,1,instr(t.上传时间,':')-1)||':00'

1570700941(1).jpg


  • 6关注人数
  • 592浏览人数
  • 最后回答于:2019-10-10 17:49
    请选择关闭问题的原因
    确定 取消
    返回顶部