关于筛选每天距八点时间最近数据的问题:表结构及内容如下: sj(时间) cjz(采集值) cjd(采集点)
2019/6/12 8:22:55 9 A1
2019/6/12 8:1:55 -99 A1
2019/6/12 8:22:55 9 A2
2019/6/12 8:1:55 20 A2
每个采集点每天一条记录,首先满足采集值大于0,然后满足采集点距八点最近,最终结果如下: sj(时间) cjz(采集值) cjd(采集点)
2019/6/12 8:22:55 9 A1
2019/6/12 8:1:55 20 A2请问该如何实现?
2019/6/12 8:22:55 9 A1
2019/6/12 8:1:55 -99 A1
2019/6/12 8:22:55 9 A2
2019/6/12 8:1:55 20 A2
每个采集点每天一条记录,首先满足采集值大于0,然后满足采集点距八点最近,最终结果如下: sj(时间) cjz(采集值) cjd(采集点)
2019/6/12 8:22:55 9 A1
2019/6/12 8:1:55 20 A2请问该如何实现?
解决方案 »
- 如何优化一段sql
- Oracle的tns问题
- 帮忙弄个查询语句,有点困难
- 请教高手 共享池设置 如何设置shared_pool_reserved_min_alloc
- 请大虾们帮忙看看这是什么意思?
- 一个字符转换的问题----在线等待
- 如何select出一张表内某个字段是最小的,或者是空的那条纪录(该字段可能有null值)内有详细描述!!!
- Windows2000Server上安装Oracle8.1.6不成功,求助?
- Oracle DS Forms 为何运行不了
- SqlSerVer存储过程转Oracle求各位大神指教!!!!!!
- 为什么cmd能运行javac,不能运行java
- 大神求助!现有大量数据的列(PK_ID)排序断开了,如何新增数据时继续排序
WITH
T1 AS (
SELECT '2019/6/12 8:22:55' SJ,9 CJZ,'A1' CJD FROM DUAL UNION ALL
SELECT '2019/6/12 8:1:55' SJ,-99 CJZ,'A1' CJD FROM DUAL UNION ALL
SELECT '2019/6/12 8:22:55' SJ,9 CJZ,'A2' CJD FROM DUAL UNION ALL
SELECT '2019/6/12 8:1:55' SJ,20 CJZ,'A2' CJD FROM DUAL ),
T2 AS (SELECT TO_DATE(SJ,'YYYY/MM/DD HH24:MI:SS') SJ, CJZ, CJD FROM T1
WHERE T1.CJZ > 0),
T3 AS (SELECT SJ, CJZ, CJD,ABS(SJ-TRUNC(SJ)+1/3) SJ_MIN FROM T2),
T4 AS (SELECT CJD,MIN(SJ_MIN) SJ_MIN FROM T3 GROUP BY CJD)
SELECT T3.SJ, T3.CJZ, T3.CJD FROM T3 JOIN T4 ON T4.CJD = T3.CJD AND T4.SJ_MIN = T3.SJ_MIN
ORDER BY T3.CJD;
(SELECT TO_DATE('2019/6/12 7:59:55', 'YYYY/MM/DD HH24:MI:SS') SJ,
9 CJZ,
'A1' CJD
FROM DUAL
UNION ALL
SELECT TO_DATE('2019/6/12 8:1:55', 'YYYY/MM/DD HH24:MI:SS') SJ,
-99 CJZ,
'A1' CJD
FROM DUAL
UNION ALL
SELECT TO_DATE('2019/6/12 8:22:55', 'YYYY/MM/DD HH24:MI:SS') SJ,
9 CJZ,
'A2' CJD
FROM DUAL
UNION ALL
SELECT TO_DATE('2019/6/12 8:1:55', 'YYYY/MM/DD HH24:MI:SS') SJ,
20 CJZ,
'A2' CJD
FROM DUAL),
T2 AS
(SELECT T1.*,
ROW_NUMBER() OVER(PARTITION BY CJD, TRUNC(SJ) ORDER BY ABS(TO_DATE(TO_CHAR(SJ, 'YYYY/MM/DD') || '08:00:00', 'YYYY/MM/DD HH24:MI:SS') - SJ)) AS RN
FROM T1)
SELECT * FROM T2 WHERE T2.RN = 1
ROW_NUMBER() OVER(PARTITION BY CJD, TRUNC(SJ) ORDER BY ABS(TO_DATE(TO_CHAR(SJ, 'YYYY/MM/DD') || '08:00:00', 'YYYY/MM/DD HH24:MI:SS') - SJ)) AS RN
FROM T1
where CJZ > 0少了一个条件
SELECT to_date('2019/6/12 8:22:55', 'yyyy/mm/dd hh24:mi:ss') SJ,9 CJZ,'A1' CJD FROM DUAL UNION ALL
SELECT to_date('2019/6/12 8:1:55', 'yyyy/mm/dd hh24:mi:ss') SJ,-99 CJZ,'A1' CJD FROM DUAL UNION ALL
SELECT to_date('2019/6/12 8:22:55', 'yyyy/mm/dd hh24:mi:ss') SJ,9 CJZ,'A2' CJD FROM DUAL UNION ALL
SELECT to_date('2019/6/12 8:1:55', 'yyyy/mm/dd hh24:mi:ss') SJ,20 CJZ,'A2' CJD FROM DUAL
)
select distinct t1.cjd, first_value(t1.cjz) over(partition by t1.cjd order by abs(to_char(t1.sj, 'sssss') - 3600 * 8))
from tab1 t1
;
SELECT to_date('2019/6/12 8:22:55', 'yyyy/mm/dd hh24:mi:ss') SJ,9 CJZ,'A1' CJD FROM DUAL UNION ALL
SELECT to_date('2019/6/12 8:1:55', 'yyyy/mm/dd hh24:mi:ss') SJ,-99 CJZ,'A1' CJD FROM DUAL UNION ALL
SELECT to_date('2019/6/12 8:22:55', 'yyyy/mm/dd hh24:mi:ss') SJ,9 CJZ,'A2' CJD FROM DUAL UNION ALL
SELECT to_date('2019/6/12 8:1:55', 'yyyy/mm/dd hh24:mi:ss') SJ,20 CJZ,'A2' CJD FROM DUAL
)
select distinct t1.cjd,
first_value(t1.cjz) over(partition by t1.cjd order by abs(to_char(t1.sj, 'sssss') - 3600 * 8)) ,
first_value(t1.sj) over(partition by t1.cjd order by abs(to_char(t1.sj, 'sssss') - 3600 * 8))
from tab1 t1
where t1.cjz > 0
;
*
FROM
tab t1
WHERE
EXISTS (
SELECT
1
FROM
( SELECT t2.cjd, max( sj ) maxtime FROM tab t2 WHERE sj < '2019-10-10 08:00:00' and cjz > 0 GROUP BY t2.cjd ) t3
WHERE
t1.cjd = t3.cjd
AND t1.sj = t3.maxtime
)
refresh force on demand
start with to_date('15-11-2019 00:52:23', 'dd-mm-yyyy hh24:mi:ss') next sysdate + 1/3
as
select distinct t1.cjd,
first_value(t1.cjz) over(partition by t1.cjd order by abs(to_char(t1.sj, 'sssss') - 3600 * 8)) pv,
first_value(t1.sj) over(partition by t1.cjd order by abs(to_char(t1.sj, 'sssss') - 3600 * 8)) pt
from t1 t1
where t1.cjz> 0;做了物化视图,发现不更新,请问是怎么回事?