mysql - 过滤掉孤立表条目

标签 mysql sql duplicates gaps-and-islands

假设有一个只有两列的表格(示例如下)。每个“1”条目之后(按照下面给出的排序顺序)应该跟一个“0”。但是,如您所见,在表中,有一些“孤儿”,其中有两个连续的“1”。

如何创建一个返回所有行的查询,除了任何连续“1”中的第一行? (这会将下面的示例从 16 行减少到 14 行)

1 E
0 A
1 T
0 S
1 R
0 E
1 F
0 T
1 G
1 T
0 R
1 X
1 R
0 R
1 E
0 T

我将尝试澄清我的问题,我认为上面我简化了太多。想象一个名为 logs 的表,有四列:

  • user(包含用户名的字符串)
  • machine(唯一标识各种 PC 的字符串)
  • type(事件类型:login 为 1,logout 为 0)
  • time(记录事件的时间)

[机器/时间对提供了一个唯一的 key ,因为任何机器都不能同时登录或注销两次。据推测,如果需要,可以根据机器/时间排序人工创建“ID”列。]

这个想法是每个登录事件都应该伴随一个注销事件。用一个理想的词来说,将登录与注销相匹配是相当容易的,因此可以分析登录花费的时间。

但是,在停电的情况下,登出将不会被记录。因此(只考虑一台机器的数据,按时间排序)如果连续有两次登录事件,我们要忽略第一次登录,因为我们没有从中得到任何可靠的数据。这就是我要解决的问题。

最佳答案

前提是

  • 只有 1 是骗子,0 绝不会被骗
  • 如果前面的 1 更多,你想去掉 所有

你的文字说“除了任何连续的第一个”,但我认为,这就是你想要的。或者永远只能有2个,那就一样。

SELECT x.*
FROM   x
LEFT   JOIN x y on y.id = (x.id + 1)
WHERE  (x.nr = y.nr) IS NOT TRUE -- OR x.nr = 0
ORDER  BY x.id

如果您想保留双 0,请额外使用注释子句,但可能不需要。

问题编辑后编辑:

您可能希望在数据中添加一个自动递增列以简化操作: Generate (i.e. write) a row number index column in MySQL

其他 RDBMS(PostgreSQL、Oracle、SQL Server 等)具有窗口函数,例如 row_number()lag()lead() 使这样的操作更容易。

关于mysql - 过滤掉孤立表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8149685/

相关文章:

java - jhipster 和 liquibase 超时

asp.net - Oracle:如何参数化列表?

sql - SQL Server 函数

mysql - 在 SQL 中查找不同的重复值并全部显示

duplicates - 如何用 Simhash 算法比较文档的相似度?

php - 我在 Windows 8 上安装了 Xampp。当我尝试在 XAMPP 控制面板中启动 MySql 时,出现以下消息,并且 MySql 无法启动

python - 为 mysql 日期时间字段创建并插入 strftime 对象

php - DELETE FROM 不适用于多个表 - 对 mysql 毫 headless 绪

sql - 在VBA中引用查询结果,也许可以使用SQL?

r - 基于重复 ID 的子集,并且值是否与后续行的另一列中的值重复