如何基于可变时间戳记录划分数据-SQL
我有这样一个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
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]