如何基于可变时间戳记录划分数据-SQL

如何基于可变时间戳记录划分数据-SQL,sql,sql-server,group-by,Sql,Sql Server,Group By,我有这样一个SQL数据库: Id Text DateTime ---------------------------- 1 Event1 1/1/1900 12:00:00 2 Event2 1/1/1900 12:10:11 3 Event3 1/1/1900 12:11:10 4 Event2 1/1/1900 12:12:12 5 Event3 1/1/1900 12:13:19 6

我有这样一个SQL数据库:

Id    Text       DateTime
----------------------------
1     Event1     1/1/1900 12:00:00
2     Event2     1/1/1900 12:10:11
3     Event3     1/1/1900 12:11:10
4     Event2     1/1/1900 12:12:12
5     Event3     1/1/1900 12:13:19
6     Event1     1/1/1900 12:14:22
7     Event2     1/1/1900 12:15:15
8     Event2     1/1/1900 12:18:16
9     Event3     1/1/1900 12:23:00
10    Event3     1/1/1900 12:24:11
我想找出哪个事件先发生,由Event1 Occurrence分区。i、 e.哪些事件2发生在任何其他事件2之前,但发生在事件1之后

到目前为止,我有一些类似于:

SELECT t1.* from Database t1 join
(select ROW_NUMBER() OVER
(PARTITION BY Text ORDER BY DateTime ASC) AS Ranking,
Id from Database
where  DateTime>(select MAX(DateTime) from Database where Text = 'Event1')) t2
on t1.id=t2.id and t2.Ranking=1
这只适用于最后的事件,因为我使用的是MAX。是否有一些聪明的方法可以做到这一点,我就是看不到

编辑: 澄清一下,我希望所有事件(包括事件1或不包括事件1)都被标记,如果它们是事件1发生后第一个发生的类型,则不重要

在这种情况下,输出如下所示:

Id
---
2
3
7
9

如果第一个Event2之前总是有Event1,则可以使用:

WITH cte AS (SELECT *,ROW_NUMBER() OVER (ORDER BY DateTime) RN
             FROM Table1)
SELECT b.*
FROM cte a
JOIN cte b
 ON a.text = 'event1' and b.text = 'event2'
 AND a.RN = b.RN - 1
演示:

我正在修改你的排号。我正在把它设置为 我的逻辑的新partiton Id。请原谅。这里我将创建一个分区 对于每个事件1、2、3下一个事件1、2、3等,使用光标, 因为没有其他可能采取分区

现在我将根据Id和文本进行分区,以获得 最短日期时间


您能否将示例输出添加到您的问题中?
WITH cte AS (SELECT *,ROW_NUMBER() OVER (ORDER BY DateTime) RN
             FROM Table1)
SELECT b.*
FROM cte a
JOIN cte b
 ON a.text = 'event1' and b.text = 'event2'
 AND a.RN = b.RN - 1
 DECLARE @ROW INT=0,
        @TEXT VARCHAR(10),
        @DATETIME DATETIME,
        @TMPDATE DATETIME,
        @CUR CURSOR

        SET @CUR = CURSOR FOR SELECT #TABLE.Text [Text],#TABLE.[DateTime] FROM #TABLE
                   ORDER BY [DateTime]

        OPEN @CUR           
            FETCH NEXT FROM @CUR INTO @TEXT,@DATETIME
            WHILE @@FETCH_STATUS = 0   
            BEGIN   

                IF(@TEXT='Event1')
                BEGIN

                    SET @ROW=@ROW+1;

                END

                UPDATE #TABLE SET ID=@ROW WHERE [Text]=@TEXT AND [DateTime]=@DATETIME;  

                FETCH NEXT FROM @CUR INTO @TEXT,@DATETIME       
            END

        CLOSE @CUR
        DEALLOCATE @CUR
        SELECT DISTINCT ID,[TEXT]
        ,CASE WHEN [TEXT]= 'EVENT1' THEN [DateTime] ELSE MIND END [DATETIME]        
        FROM
        (
            SELECT ID,[Text],[DateTime]
            ,MIN([DATETIME]) OVER(PARTITION BY ID,[Text]) MIND
            FROM #TABLE 
        )TAB
        ORDER BY [DATETIME]