gpt4 book ai didi

c# - Oracle/SQL 命令仅显示条件发生更改的行

转载 作者:行者123 更新时间:2023-11-29 07:42:37 25 4
gpt4 key购买 nike

我的数据库如下所示(按DATETIME排序):

enter image description here

我的问题是有数千个条目,但我只需要 Pumpe1_1FALSE 更改为 TRUE 的行或从TRUEFALSE。所以在这个例子中我只需要两行(绿色标记):

enter image description here

我需要的下一行是当 Pumpe1_1 变回 FALSE 时的情况。

到目前为止我的 SQL 语句是

SELECT DATETIME, TOTALTIME1, RAWOUTPUT1, 
CASE BITAND(RAWOUTPUT1, POWER(2,0)) WHEN 0 THEN 'FALSE' ELSE 'TRUE' END AS Pumpe1_1 FROM pump_box_hist

我唯一的想法是,如果 Pumpe1_1 发生更改,则循环抛出条目(当发送到 C# 中的数据表时),或者是否有更好更快的方法直接在数据库上执行此操作?谢谢!

编辑 San 的答案:

我在您的解决方案中添加了我的旧代码片段,其中包含 TRUE/FALSE:

WITH table_ AS ( 
SELECT DATETIME, TOTALTIME1, RAWOUTPUT1,
LEAD (RAWOUTPUT1) OVER (ORDER BY datetime) next_,
LAG (RAWOUTPUT1) OVER (ORDER BY datetime) priv_,
CASE BITAND(RAWOUTPUT1, POWER(2,0)) WHEN 0 THEN 'FALSE' ELSE 'TRUE' END AS Pumpe1_1
FROM pump_box_hist)
SELECT DATETIME, TOTALTIME1, RAWOUTPUT1, Pumpe1_1
FROM table_
WHERE (RAWOUTPUT1 != next_ OR RAWOUTPUT1 != priv_);

但似乎只有当RAWOUTPUT1改变时它才有效,结果:

DATETIME                  TOTALTIME1             RAWOUTPUT1             PUMPE1_1 
------------------------- ---------------------- ---------------------- --------
30.10.14 52037 0 FALSE
30.10.14 52037 1 TRUE
30.10.14 52037 1 TRUE
30.10.14 52037 3 TRUE
30.10.14 52037 3 TRUE
30.10.14 52361 1 TRUE
30.10.14 52361 1 TRUE
30.10.14 53848 0 FALSE
30.10.14 53848 0 FALSE
30.10.14 53848 1 TRUE
30.10.14 53848 1 TRUE
30.10.14 54693 4 FALSE
30.10.14 54693 4 FALSE
30.10.14 54693 6 FALSE

因此,目标是获取 TRUE/FALSE 的重复项以获得此结果(只有 TRUE/FALSE 更改时的行):

DATETIME                  TOTALTIME1             RAWOUTPUT1             PUMPE1_1 
------------------------- ---------------------- ---------------------- --------
30.10.14 52037 0 FALSE
30.10.14 52037 1 TRUE
30.10.14 53848 0 FALSE
30.10.14 53848 1 TRUE
30.10.14 54693 4 FALSE

再次感谢!

更新2:

再次了解到,我不知道我需要像您的脚本中那样的第二个表,这回答了为什么我尝试使用 Pumpe1_1 更改 LAG/LEAD 失败>...

我转换了日期以查看问题仍然存在。这是脚本的输出:

Converted Time          DATETIME                  TOTALTIME1             RAWOUTPUT1             PUMPE1_1 
----------------------- ------------------------- ---------------------- ---------------------- --------
Do 30-Okt-2014 11:23:24 30.10.14 52037 0 FALSE
Do 30-Okt-2014 11:23:39 30.10.14 52037 1 TRUE
Do 30-Okt-2014 11:48:23 30.10.14 52361 1 TRUE
Do 30-Okt-2014 11:48:37 30.10.14 53848 0 FALSE
Do 30-Okt-2014 12:53:20 30.10.14 53848 0 FALSE
Do 30-Okt-2014 12:53:34 30.10.14 53848 1 TRUE
Do 30-Okt-2014 13:07:23 30.10.14 53848 1 TRUE
Do 30-Okt-2014 13:07:38 30.10.14 54693 4 FALSE
Do 30-Okt-2014 14:36:40 30.10.14 55288 20 FALSE
Do 30-Okt-2014 14:36:58 30.10.14 55288 17 TRUE
Do 30-Okt-2014 15:02:16 30.10.14 55288 17 TRUE

输入是:

Converted Time          DATETIME                  TOTALTIME1             RAWOUTPUT1             PUMPE1_1 
----------------------- ------------------------- ---------------------- ---------------------- --------
Do 30-Okt-2014 11:22:55 30.10.14 52037 0 FALSE
Do 30-Okt-2014 11:23:10 30.10.14 52037 0 FALSE
Do 30-Okt-2014 11:23:24 30.10.14 52037 0 FALSE
Do 30-Okt-2014 11:23:39 30.10.14 52037 1 TRUE
Do 30-Okt-2014 11:23:53 30.10.14 52037 1 TRUE
....
Do 30-Okt-2014 11:48:08 30.10.14 52361 1 TRUE
Do 30-Okt-2014 11:48:23 30.10.14 52361 1 TRUE
Do 30-Okt-2014 11:48:37 30.10.14 53848 0 FALSE
Do 30-Okt-2014 11:48:52 30.10.14 53848 0 FALSE
....
Do 30-Okt-2014 12:52:51 30.10.14 53848 0 FALSE
Do 30-Okt-2014 12:53:05 30.10.14 53848 0 FALSE
Do 30-Okt-2014 12:53:20 30.10.14 53848 0 FALSE
Do 30-Okt-2014 12:53:34 30.10.14 53848 1 TRUE
Do 30-Okt-2014 12:53:49 30.10.14 53848 1 TRUE
....

因此,当 Pumpe1_1TRUE 更改为 FALSE 或以其他方向更改时,输出也会采用更改之前的行。例子:11:23:39 从 FALSE 更改为 TRUE,但我也得到之前的行仍然是 FALSE。不知道为什么...

最佳答案

在 Oracle 中,您可以结合使用超前和滞后分析函数来获得所需的结果:

WITH table_ AS ( 
SELECT DATETIME, TOTALTIME1, RAWOUTPUT1,
LEAD (RAWOUTPUT1) OVER (ORDER BY datetime) next_,
LAG (RAWOUTPUT1) OVER (ORDER BY datetime) priv_
FROM pump_box_hist)
SELECT DATETIME, TOTALTIME1, RAWOUTPUT1
FROM table_
WHERE (RAWOUTPUT1 != next_ OR RAWOUTPUT1 != priv_);

更新:根据您的输入,对查询进行了一些小更改以获取您要查找的内容。如果有效请告诉我

WITH table_ AS ( 
SELECT DATETIME, TOTALTIME1, RAWOUTPUT1,
CASE BITAND(RAWOUTPUT1, POWER(2,0)) WHEN 0 THEN 'FALSE' ELSE 'TRUE' END AS Pumpe1_1
FROM pump_box_hist),
table2_ AS (
SELECT DATETIME, TOTALTIME1, RAWOUTPUT1, Pumpe1_1,
LEAD (Pumpe1_1) OVER (ORDER BY datetime) next_,
LAG (Pumpe1_1) OVER (ORDER BY datetime) priv_
FROM table_)
SELECT DATETIME, TOTALTIME1, RAWOUTPUT1, Pumpe1_1
FROM table2_
WHERE (Pumpe1_1 != next_ OR Pumpe1_1 != priv_);

关于c# - Oracle/SQL 命令仅显示条件发生更改的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28627416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com