SQL问题

QQ图片20200911090419.png因为数据是按照每天一张表存放的 所以多天查询的时候   就需要表关联

select a,b,d,min(c) as minc,max(c) as maxc, DATEDIFF(mi,min(c),max(c))+1 as 时长 from (

select a,b,c,row_number() over (partition by a order by c)-row_number() over (partition by a,b order by c) as d from (

select id a,case when cast (value as float)>=20 then '运行' else '停机' end as b,acptime c from 

${REPLACE(SQL("JDBC5","select name from sysobjects where xtype='u' and name like 'ValueTable_FLOAT_%' and REPLACE(name,'ValueTable_FLOAT_','')>='"+FORMAT(KSRQ,"yyyy_MM_dd")+"' and REPLACE(name,'ValueTable_FLOAT_','')<='"+FORMAT(JSRQ,"yyyy_MM_dd")+"'",1),","," where 1=1 "+IF(LEN(ID)==0,""," and ID IN ('"+ID+"')")+" union all select ID,Value,AcpTime from ")} where 1=1 ${IF(LEN(ID)==0,""," and ID IN ('"+ID+"')")}

) t1

) t2

group by a,b,d

这个SQL 如果只查当天的数据是正常的 如果查询1天以上就会出现问题  就第一天的数据是正常的 后面的数据 不正常

孤陌 发布于 2020-9-11 09:04 (编辑于 2020-9-11 09:04)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
jongwangLv6中级互助
发布于2020-9-11 09:24(编辑于 2020-9-11 09:27)

目前的结果肯定是就对第一个name进行了case when的替换的

,你要后面的都替换,就把case when的语句也写到replace 的后面替换的部分里面,或者先把目前replace部分全部查出来,再在外层用case when。

image.png

其实问题不是日期选择上,当日如果有多个name的话,应该也只有第一个name下能出来运行或者停机的结果,其他的还是会是数字

试下这个看看:

SELECT  a
       ,b
       ,d
       ,MIN(c)                       AS minc
       ,MAX(c)                       AS maxc
       ,DATEDIFF(mi,MIN(c),MAX(c))+1 AS 时长
FROM 
(
       SELECT  a
              ,b
              ,c
              ,row_number() over (partition by a ORDER BY c)-row_number() over (partition by a,b ORDER BY c) AS d
       FROM 
       (
              SELECT  id a
                     ,case WHEN cast (value AS float)>=20 THEN '运行' else '停机' end AS b
                     ,acptime c
              FROM ${REPLACE
              (SQL("JDBC5","
                     SELECT  name
                     FROM sysobjects
                     WHERE xtype='u' 
                     AND name like 'ValueTable_FLOAT_%' 
                     AND REPLACE(name,'ValueTable_FLOAT_','')>='"+FORMAT(KSRQ,"yyyy_MM_dd")+"' 
                     AND REPLACE(name,'ValueTable_FLOAT_','')<='"+FORMAT(JSRQ,"yyyy_MM_dd")+"'",1),","," 
                     WHERE 1=1 "+IF(LEN(ID)==0,""," AND ID IN ('"+ID+"')")+"  
                     UNION ALL
                     SELECT  ID
                            ,case WHEN cast (value AS float)>=20 THEN '运行' else '停机' end AS Value
                            ,AcpTime
                     FROM "
              )}
              WHERE 1=1 ${IF(LEN(ID)==0,""," AND ID IN ('"+ID+"')")}  
       ) t1 
) t2
GROUP BY  a
         ,b
         ,d


  • 孤陌 孤陌(提问者) 问题就是出在这里 老哥 6666
    2020-09-11 10:49 
  • jongwang jongwang 回复 孤陌(提问者) 嗐,有时候确实会sql卡思路一卡卡很久
    2020-09-11 13:21 
最佳回答
0
pengfuqiang96Lv7初级互助
发布于2020-9-11 09:21

之前我一个同事写过一个 用的是在数据集中js循环读表的方式 你可以试试  但具体咋个写就不知道了。

最佳回答
0
axingLv6专家互助
发布于2020-9-11 10:46(编辑于 2020-9-11 10:46)
select a,b,d,min(c) as minc,max(c) as maxc, DATEDIFF(mi,min(c),max(c))+1 as 时长 from (
select a,b,c,row_number() over (partition by a order by c)-row_number() over (partition by a,b order by c) as d from (
select id a,case when cast (value as float)>=20 then '运行' else '停机' end as b,acptime c from 
${REPLACE(SQL("JDBC5","select name from sysobjects where xtype='u' and name like 'ValueTable_FLOAT_%' and REPLACE(name,'ValueTable_FLOAT_','')>='"+FORMAT(KSRQ,"yyyy_MM_dd")+"' and REPLACE(name,'ValueTable_FLOAT_','')=20 then '运行' else '停机' end as b,acptime c from ")} where 1=1 ${IF(LEN(ID)==0,""," and ID IN ('"+ID+"')")}
) t1
) t2
group by a,b,d


  • 4关注人数
  • 643浏览人数
  • 最后回答于:2020-9-11 10:46
    请选择关闭问题的原因
    确定 取消
    返回顶部