在运行时在基于sql数据库集的数据库中过滤出重复值
我有一个数据库问题,目前无法用简单的解决方案来解决。在我的数据库中,我有一个存储事件值的表。。带有时间戳的0和1。问题在于,同一事件可能作为业务规则发生两次。如下在运行时在基于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-
- 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
现在,如果您需要存储两组状态,触发器始终可以插入到包含所有的表中,但只有在值更改时才在“筛选”表中进行查找和插入。这样我才能理解问题所在 如果您根据时间戳对行集进行排序,有时会出现重复值,就像上面第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