【发布时间】:2011-11-16 09:56:10
【问题描述】:
假设有一个只有两列的表(示例如下所示)。每个 '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(事件类型:1 表示 login,0 表示 logout) -
time(记录事件的时间)
[机器/时间对提供唯一的密钥,因为没有机器可以在同一时刻登录或退出两次。如果需要,可以根据机器/时间排序人工创建一个“ID”列。]
这个想法是每个登录事件都应该伴随一个注销事件。用理想的话来说,将登录与注销相匹配是相当容易的,因此可以分析登录所花费的时间。
但是,在断电的情况下,不会记录注销。因此(仅考虑一台机器的数据,按时间排序)如果连续两次登录事件,我们希望忽略第一次登录,因为我们没有任何可靠的数据。这就是我要解决的问题。
【问题讨论】:
-
SQL 表没有顺序。想要一行后面跟着另一行是没有意义的。如果您想要自然顺序使用 id。
-
排序是如何实现的?我们可以为此假设一个额外的 id 列?
-
@Erwin,是的,我忽略了其他一些列(提供排序顺序)(因为我认为这会使事情变得更简单,并专注于问题)
-
@fluteflute,由于 ID 在确定序列中的“下一个”记录时必不可少,因此它是问题的重要部分。 Benoit 发布了一个解决方案,该解决方案依赖于 ID 是由 1 迭代的完整数字序列 - 这是否现实?
-
另外,表名和列名也会有所帮助。
标签: mysql sql duplicate-removal gaps-and-islands