C# Oracle/SQL命令,用于仅显示条件已更改的行

C# Oracle/SQL命令,用于仅显示条件已更改的行,c#,mysql,sql,oracle,C#,Mysql,Sql,Oracle,我的数据库如下所示(按日期时间排序): 我的问题是有数千个条目,但我只需要将Pumpe1_1从FALSE更改为TRUE或从TRUE更改为FALSE的行。因此,在本例中,我只需要两行(绿色标记): 我需要的下一行是当Pumpe1\u 1变回FALSE时 到目前为止,我的SQL语句是 SELECT DATETIME, TOTALTIME1, RAWOUTPUT1, CASE BITAND(RAWOUTPUT1, POWER(2,0)) WHEN 0 THEN 'FALSE' ELSE 'TRU

我的数据库如下所示(按日期时间排序):

我的问题是有数千个条目,但我只需要将
Pumpe1_1
FALSE
更改为
TRUE
或从
TRUE
更改为
FALSE
的行。因此,在本例中,我只需要两行(绿色标记):

我需要的下一行是当
Pumpe1\u 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\u 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更改时才有行):

再次感谢

更新2:

同样,我所学到的是,我不知道我需要第二个表,就像在你的脚本中一样,这回答了为什么我尝试用
Pumpe1_1
更改
滞后/超前时失败的原因

我转换了日期,看看问题还在哪里。 这是脚本的输出:

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_1
TRUE
更改为
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_);

如果这就是您的数据的外观,那么简单的distinct将起作用。您还可以使用max(您的_日期)和group by处理更复杂的数据以及分析函数-row_number()over

SELECT distinct datetime, totaltime, rowoutput, pumpe1_1  FROM
(
SELECT '30.10.14' datetime, 53848 totaltime, 0 rowoutput, 'FALSE' pumpe1_1 FROM dual
UNION ALL
SELECT '30.10.14', 53848, 0, 'FALSE' FROM dual
UNION ALL
SELECT '30.10.14', 53848, 0, 'FALSE' FROM dual
UNION ALL
SELECT '30.10.14', 53847, 1, 'TRUE' FROM dual
UNION ALL
SELECT '30.10.14', 53847, 1, 'TRUE'  FROM dual
UNION ALL
SELECT '30.10.14', 53847, 1, 'TRUE'  FROM dual
)
/

您是否同时需要MySQL和Oracle解决方案?问题是您的表中似乎包含大量重复行(相同日期、totaltime等)。@jarlh我只需要Oracle,这不是我的孔数据库,所以它看起来像重复的柄,但我的数据库中没有重复的值,因为示例不是我的孔数据库,那么您可能应该发布类似于您的数据的内容。。。正如我所写的,在这种情况下,max()或analysis将起作用。祝你好运。几乎完美,但当真/假改变时,我只需要行。请看我在问题中的编辑。Thanks@katz,更新了答案。我认为问题发生在
next
prev
都更改时,因此需要一个条件,如
If(Pumpe1_1==TRUE&&Pumpe1_1==TRUE)行。delete()
以及其他方向尝试删除其中一个条件,即在where子句中仅使用一个条件,
WHERE Pumpe1_1!=仅限next(下一步)。或者,如果您只希望从FALSE切换到TRUE,则使用条件
,其中Pumpe1_1='FALSE'和next(下一步)='TRUE'
SELECT distinct datetime, totaltime, rowoutput, pumpe1_1  FROM
(
SELECT '30.10.14' datetime, 53848 totaltime, 0 rowoutput, 'FALSE' pumpe1_1 FROM dual
UNION ALL
SELECT '30.10.14', 53848, 0, 'FALSE' FROM dual
UNION ALL
SELECT '30.10.14', 53848, 0, 'FALSE' FROM dual
UNION ALL
SELECT '30.10.14', 53847, 1, 'TRUE' FROM dual
UNION ALL
SELECT '30.10.14', 53847, 1, 'TRUE'  FROM dual
UNION ALL
SELECT '30.10.14', 53847, 1, 'TRUE'  FROM dual
)
/