SQL每周跟踪问题(递归函数?)

SQL每周跟踪问题(递归函数?),sql,sql-server-2008-r2,recursive-query,Sql,Sql Server 2008 R2,Recursive Query,我已经尽了最大的努力,但找不到答案。我有一个表格,每周我都会记录另一个表格中的ID;这样我就可以通过ID跟踪问题。因此,如果一周内有ID,问题就在那里。如果下周该ID不再存在,则问题已解决 例如,这将是一个示例数据集: 创建表递归测试 ID int, 快照日期 插入到递归测试中 价值观 123456,'2014-09-01', 123456,'2014-09-08', 123456,'2014-09-15', 3123456,'2014-09-08', 3123456,'2014-09-15',

我已经尽了最大的努力,但找不到答案。我有一个表格,每周我都会记录另一个表格中的ID;这样我就可以通过ID跟踪问题。因此,如果一周内有ID,问题就在那里。如果下周该ID不再存在,则问题已解决

例如,这将是一个示例数据集:

创建表递归测试 ID int, 快照日期 插入到递归测试中 价值观 123456,'2014-09-01', 123456,'2014-09-08', 123456,'2014-09-15', 3123456,'2014-09-08', 3123456,'2014-09-15', 3123456,'2014-09-22', 6123456,“2014-09-29”

我试图得到的观点是: 在9月1日,我有一个问题,只有一个ID,日期是9月1日 在9月8日,我发行了2期,其中一期是新的3123456,因为上周没有 在9月15日,我还有两个问题 在9月22日,我已经解决了123456号问题,现在已经不存在了,还有一个问题 在9月29日,我有另一个已解决的问题,加上一个在6123456之前没有的新问题

我可以在伪代码中声明我想要的东西,但无法将其转换为SQL代码。。。我正在使用MS SQL server 2008

伪代码: 对于每个快照日期的每个ID: 如果没有以前的快照日期,请将问题标记为新问题 否则: 与上周一起离开;如果上周ID为空,则为新问题 右图加入上周;如果本周ID为空,则解决该问题

我觉得我需要某种递归函数每周运行一次,然后执行联接,然后执行一个操作,以确定是否存在新的或已解决的问题,但我找不到方法

有没有能帮上忙的巫师?我将不胜感激


非常感谢您抽出时间

也许这就是你想要的。。 用通俗易懂的英语说

我认为您希望显示所有ID和日期,但请指出哪些ID和日期是新的,哪些ID和日期是在解析当天关闭的。我看到的问题是,已解决的问题可能返回假阳性,因为下周的数据可能还不可用,因此将为空。因此,连接和丢失的数据在一个未被解析时都会被解析

SELECT Case when RT2.SnapshotDate is null then 1 else 0 end as isNew, 
 case when RT3.snapshotDate is null then 1 else 0 end as isResolved,
 RT1.ID , RT1.SnapshotDate
FROM  recursiveTest RT1
LEFT JOIN recursiveTest Rt2
  on RT1.ID = RT2.ID 
 and RT1.Snapshotdate > Rt2.snapshotdate
LEFT JOIN RecursiveTest RT3
 on RT1.ID = RT3.ID
 and RT1.SnapshotDate < RT3.SnapshotDate
GROUP BY Case when RT2.SnapshotDate is null then 1 else 0 end, 
         case when RT3.snapshotDate is null then 1 else 0 end, RT1.ID , RT1.SnapshotDate
ORDER BY RT1.ID, Rt1.SnapshotDate
因为我们不关心之前有多少人,之后有多少人,所以我使用GROUPBY来限制在给定条目上可能出现的卡地赛人

我在顶部说明的问题在2014年9月29日ID 6123456可见。下周不可见,因此它被标记为已解决。但事实并非如此。您提供的数据无法表明这一点,除非我们假设无论数据集如何,最大日期始终处于打开状态。如果是这样,我们可以通过

Select isNew, isResolved, ID, Snapshotdate FROM (
Select Case when RT2.SnapshotDate is null then 1 else 0 end as isNew, 
 case when RT1.snapshotDate = (Select max(snapshotDate) from recursiveTest) then 0 
       when RT3.snapshotDate is null then 1  else 0 end as isResolved,
 RT1.ID , RT1.SnapshotDate
from recursiveTest RT1
LEFT JOIN recursiveTest Rt2
  on RT1.ID = RT2.ID 
 and RT1.Snapshotdate > Rt2.snapshotdate
LEFT JOIN RecursiveTest RT3
 on RT1.ID = RT3.ID
 and RT1.SnapshotDate < RT3.SnapshotDate) 
GROUP BY isNew, isResolved, ID, Snapshotdate
order by ID, SnapshotDate
或作为产生相同结果的CTE公共表表达式

WITH CTE AS (
SELECT Case when RT2.SnapshotDate is null then 1 else 0 end as isNew, 
 case when RT1.snapshotDate = (Select max(snapshotDate) from recursiveTest) then 0 
       when RT3.snapshotDate is null then 1  else 0 end as isResolved,
 RT1.ID , RT1.SnapshotDate
FROM recursiveTest RT1
LEFT JOIN recursiveTest Rt2
  on RT1.ID = RT2.ID 
 and RT1.Snapshotdate > Rt2.snapshotdate
LEFT JOIN RecursiveTest RT3
 on RT1.ID = RT3.ID
 and RT1.SnapshotDate < RT3.SnapshotDate) 
SELECT isNew, isResolved, ID, SnapshotDate
FROM CTE
GROUP BY isNew, isResolved, ID, Snapshotdate
ORDER BY ID, SnapshotDate

你的规则对我来说没什么意义。如果您正在填充此表,如果您还没有输入新的周数据,它可能会在您可能还没有输入周数据时将某些问题标记为已解决。非常感谢xQbert。这正是我需要的。您最近的假设是正确的:无论数据集如何,最大日期始终保持打开状态。非常感谢你的帮助。
  isNew isResolved ID       SnapShotDate
    1   0          123456   01-SEP-14 00:00:00
    0   0          123456   08-SEP-14 00:00:00
    0   1          123456   15-SEP-14 00:00:00
    1   0          3123456  08-SEP-14 00:00:00
    0   0          3123456  15-SEP-14 00:00:00
    0   1          3123456  22-SEP-14 00:00:00
    1   0          6123456  29-SEP-14 00:00:00
WITH CTE AS (
SELECT Case when RT2.SnapshotDate is null then 1 else 0 end as isNew, 
 case when RT1.snapshotDate = (Select max(snapshotDate) from recursiveTest) then 0 
       when RT3.snapshotDate is null then 1  else 0 end as isResolved,
 RT1.ID , RT1.SnapshotDate
FROM recursiveTest RT1
LEFT JOIN recursiveTest Rt2
  on RT1.ID = RT2.ID 
 and RT1.Snapshotdate > Rt2.snapshotdate
LEFT JOIN RecursiveTest RT3
 on RT1.ID = RT3.ID
 and RT1.SnapshotDate < RT3.SnapshotDate) 
SELECT isNew, isResolved, ID, SnapshotDate
FROM CTE
GROUP BY isNew, isResolved, ID, Snapshotdate
ORDER BY ID, SnapshotDate