当前位置: 首页 > 面试题库 >

在多个参数和条件下检测SQL孤岛

孟修竹
2023-03-14
问题内容

(PostgreSQL 8.4) 我对SQL的空白和孤岛做了很好的介绍,但是我仍然有一个问题。许多孤岛检测CTE基于时间戳的运行顺序和一些标志,这些标志在更改时会破坏序列。但是,如果“中断”条件稍微复杂些怎么办?

CREATE TABLE T1
(
  id SERIAL PRIMARY KEY,
  val INT,   -- some device
  status INT -- 0=OFF, 1=ON
);

INSERT INTO T1 (val, status) VALUES (10, 1);
INSERT INTO T1 (val, status) VALUES (10, 0);
INSERT INTO T1 (val, status) VALUES (11, 1);
INSERT INTO T1 (val, status) VALUES (11, 1);
INSERT INTO T1 (val, status) VALUES (10, 0);
INSERT INTO T1 (val, status) VALUES (12, 1);
INSERT INTO T1 (val, status) VALUES (13, 1);
INSERT INTO T1 (val, status) VALUES (13, 0);
INSERT INTO T1 (val, status) VALUES (13, 1);

在这种情况下,val表示设备,并且statusONOFF。我想选择的记录13679具有以下逻辑。

  1. 10转为OFF-正确结束序列,忽略行

  2. 11接通-确定,新序列,包括在SELECT中

  3. 11开启-重复,忽略行

  4. 10熄灭-#10没亮,请忽略

  5. 12开启-确定,隐式关闭#11,包括在SELECT中

  6. 13开启-确定,隐式关闭#12,包括在SELECT中

  7. 13设为OFF-正确结束序列,忽略行

  8. 13接通-确定,新序列,包括在SELECT中

基本上,一次只能打开一个设备,并且“中断”条件是:

  • new.val = running.val AND new.status = 0
  • new.val <> running.val AND new.status = 1

我正在寻找CTE形式的东西, 请不要游标


问题答案:

回答更新的问题

SELECT *
FROM  (
   SELECT *
         ,lag(val, 1, 0) OVER (PARTITION BY status ORDER BY id) last_val
         ,lag(status) OVER (PARTITION BY val ORDER BY id) last_status
   FROM   t1
   ) x
WHERE  status = 1
AND    (last_val <> val OR last_status = 0)

如何?

与以前相同,但是这次结合了两个窗口功能。打开设备是否符合以下条件:
1.最后打开的设备是否与其他设备 不同
2.或同一设备的最后一个条目已 关闭NULL分区的第一行与的大写字母无关紧要,因为那么该行已经在 1中 限定了

回答问题的原始版本。

如果您正确地理解了您的任务,则可以通过以下简单查询完成任务:

SELECT *
FROM  (
   SELECT *
         ,lag(val, 1, 0) OVER (ORDER BY id) last_on
   FROM   t1
   WHERE  status = 1
   ) x
WHERE  last_on <> val

根据要求返回第1、3、6、7行。

如何?

根据您的描述,子查询将忽略所有关闭操作,因为这仅仅是噪音。将条目保留在打开设备的位置。其中,只有那些条目已被取消资格,而同一设备已经处于打开状态(最后一个条目处于打开状态)。为此使用窗口功能lag()。特别是,我0默认提供第一行的特殊情况-假设没有带的设备val = 0
如果有,请选择另一个不可能的数字。
如果没有数字是不可能的,则保留和一样的特殊情况NULLlag(val) OVER ...并在外部查询中检查与:

WHERE last_on IS DISTINCT FROM val


 类似资料:
  • 问题内容: 我正在尝试计算连续4个单独的列中的不同条目,然后总计结果。 例如,表头看起来与此类似: 每个列(保存ID)可以具有文本值W,X,Y或Z。列可以具有相同的值。 我正在尝试做的是找到一种计算列中每个条目的方法,但是每行只对W,X,Y和Z进行一次计数。因此,如果: 结果表将是: 任何帮助将不胜感激。 问题答案: 也许我错过了一些东西,但这会很简单: 没有理由一起使用,因为这样做会使结果明显。

  • 我正在努力解决这个问题。工作内容:我想打印表中的所有3行(将附上示例),并在EID列中显示值。 我想测试EID1(第一行)的值是否以8开头。(完成) 我想测试CID1(第一行)的值是否以“M”开头。(完成) 现在我想循环整个表,并检查每一行的以下条件,例如:(Done) 如果EID1= 我得到以下错误:无法调用“String.startsWith(String)”,因为java的返回值。util。

  • 我试图创建一个函数,该函数接受多个谓词条件,并根据这些条件过滤流。我找不到任何东西,但我的retList似乎只是由输入组成,而不是输入的过滤版本。 以下是给我的指示: //要生成一个整数流,并将其设置为每个谓词p的输入,请将此流变量设置为对流应用过滤器(p)的结果。完成for-each循环后,像我们在前面的问题中所做的那样,将结果流收集到一个列表中,返回结果列表 这是我目前拥有的: 这就是它的测试

  • 这是表格的样子: 状态类别列表:(跟踪、批准、审核、接收、测试、关闭) 条件:

  • 9.6. 竞争条件检测 即使我们小心到不能再小心,但在并发程序中犯错还是太容易了。幸运的是,Go的runtime和工具链为我们装备了一个复杂但好用的动态分析工具,竞争检查器(the race detector)。 只要在go build,go run或者go test命令后面加上-race的flag,就会使编译器创建一个你的应用的“修改”版或者一个附带了能够记录所有运行期对共享变量访问工具的tes

  • 问题内容: 我的df有3栏 我想删除df.col_1为1.0且df.col_2为0.0的行。因此,我会得到: 我试过了: 它给了我错误: 任何想法如何解决上述问题? 问题答案: drop是一种方法,您使用调用它,因此它为您提供了: 更改为(正常方法调用),它应该可以工作: 输出量