在运行时在基于sql数据库集的数据库中过滤出重复值

在运行时在基于sql数据库集的数据库中过滤出重复值,sql,filtered-lookup,Sql,Filtered Lookup,我有一个数据库问题,目前无法用简单的解决方案来解决。在我的数据库中,我有一个存储事件值的表。。带有时间戳的0和1。问题在于,同一事件可能作为业务规则发生两次。如下 2008-09-22 16:28:14.133',0 2008-09-22 16:28:35.233',1 2008-09-22 16:29:16.353',1 2008-09-22 16:31:37.273',0 2008-09-22 16:35:43.134',0 2008-09-22 16:36:39.633',1 2008-

我有一个数据库问题,目前无法用简单的解决方案来解决。在我的数据库中,我有一个存储事件值的表。。带有时间戳的0和1。问题在于,同一事件可能作为业务规则发生两次。如下

  • 2008-09-22 16:28:14.133',0
  • 2008-09-22 16:28:35.233',1
  • 2008-09-22 16:29:16.353',1
  • 2008-09-22 16:31:37.273',0
  • 2008-09-22 16:35:43.134',0
  • 2008-09-22 16:36:39.633',1
  • 2008-09-22 16:41:40.733',0
在现实生活中,这些事件是循环的,我试图查询这些事件的周期,但我需要忽略重复的值(1,1)。当前的解决方案是使用SQL游标循环每个事件,如果之前的值相同,则抛出该值。我考虑过在insert上使用触发器来清理后处理的表,但是我想不出一个简单的解决方案来完成这个基于集合的操作

有什么想法或建议吗

谢谢

(前言…….我只在oracle中做过这件事,但我很确定如果db支持触发器,这一切都是可能的)

使用插入前触发器选择具有最大时间戳值的行。如果该行的值与要插入的值相同,请忽略它

这将使它们保持正确的状态


现在,如果您需要存储两组状态,触发器始终可以插入到包含所有的表中,但只有在值更改时才在“筛选”表中进行查找和插入。

这样我才能理解问题所在

如果您根据时间戳对行集进行排序,有时会出现重复值,就像上面第2项和第3rt项中的1对一样?然后在第四和第五节有两个0,是吗

您想要对应对中的最后一对(或序列,如果有2对以上)

为什么需要删除它们?我这样问是因为,除非它们占据了这个表的很大一部分,否则在需要处理或显示它们时,可能更容易像按顺序一样过滤掉它们

一个解决方案,虽然不是很好,但应该是检索当前行时间戳之上的最小时间戳,然后从中检索值,如果相同,则不返回当前行

以下是获取所有内容的SQL:

SELECT timestamp, value
FROM yourtable
下面是如何加入以获得当前时间戳之上的最小时间戳:

SELECT T1.timestamp, MIN(T2.timestamp) AS next_timestamp, T1.value
FROM yourtable T1, yourtable T2
WHERE T2.timestamp > T1.timestamp
GROUP BY T1.timestamp, T1.value
(我担心上述查询速度会非常慢)

然后检索对应于该最小时间戳的值

SELECT T3.timestamp, T3.value
FROM (
    SELECT T1.timestamp, MIN(T2.timestamp) AS next_timestamp, T1.value
    FROM yourtable T1, yourtable T2
    WHERE T2.timestamp > T1.timestamp
    GROUP BY T1.timestamp, T1.value
) T3, yourtable AS T4
WHERE T3.next_timestamp = T4.timestamp
  AND T3.value <> T4.value
以下是(格式化)输出:


这个问题实际上是一个数据捕获问题。典型的数据库引擎不是解决这个问题的好选择。一个简单的预处理器应该检测输入数据集中的变化,并只存储相关数据(时间戳等)

一个简单的解决方案是在数据库环境中(例如在Oracle中)创建一个包,该包可以有本地内存变量来存储最后的输入数据集,并消除不必要的数据库访问


当然,您可以使用数据库环境的所有功能来定义“输入数据集的更改”并存储过滤后的数据。因此,它可以是简单的,也可以是复杂的。

这使用了一个SQL Server通用表表达式,但它可以是内联的,表t包含dt列和cyclestate列:

;WITH Firsts AS (
    SELECT t1.dt
        ,MIN(t2.dt) AS Prevdt
    FROM t AS t1
    INNER JOIN t AS t2
        ON t1.dt < t2.dt
        AND t2.cyclestate <> t1.cyclestate
    GROUP BY t1.dt
)
SELECT MIN(t1.dt) AS dt_start
    ,t2.dt AS dt_end
FROM t AS t1
INNER JOIN Firsts
    ON t1.dt = Firsts.dt
INNER JOIN t AS t2
    ON t2.dt = Firsts.Prevdt
    AND t1.cyclestate <> t2.cyclestate
GROUP BY t2.dt
    ,t2.cyclestate
HAVING MIN(t1.cyclestate) = 0
;以第一名为准(
选择t1.dt
,最小值(t2.dt)与上一次相同
从t到t1
内部连接t为t2
关于t1.dt
您如何知道哪些是重复值?表上有主键吗?现在我不知道;I don’我不知道你会如何分辨哪两张唱片是相互关联的。
timestamp                 value
2008-09-22 16:28:14.133   0
2008-09-22 16:29:16.353   1
2008-09-22 16:35:43.134   0
2008-09-22 16:36:39.633   1
2008-09-22 16:41:40.733   0
;WITH Firsts AS (
    SELECT t1.dt
        ,MIN(t2.dt) AS Prevdt
    FROM t AS t1
    INNER JOIN t AS t2
        ON t1.dt < t2.dt
        AND t2.cyclestate <> t1.cyclestate
    GROUP BY t1.dt
)
SELECT MIN(t1.dt) AS dt_start
    ,t2.dt AS dt_end
FROM t AS t1
INNER JOIN Firsts
    ON t1.dt = Firsts.dt
INNER JOIN t AS t2
    ON t2.dt = Firsts.Prevdt
    AND t1.cyclestate <> t2.cyclestate
GROUP BY t2.dt
    ,t2.cyclestate
HAVING MIN(t1.cyclestate) = 0