(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
表示设备,并且status
为ON
或OFF
。我想选择的记录1
,3
,6
,7
并9
具有以下逻辑。
基本上,一次只能打开一个设备,并且“中断”条件是:
我正在寻找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
。
如果有,请选择另一个不可能的数字。
如果没有数字是不可能的,则保留和一样的特殊情况NULL
,lag(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是一种方法,您使用调用它,因此它为您提供了: 更改为(正常方法调用),它应该可以工作: 输出量