我有一個包含日期和一列的表,它告訴它是否是「連接」的一系列日期中的第一個日期。 實施例SQL:獲取一系列日期中的最後一個日期
╔═══════════╦════════════╦═══════╗
║ person_id ║ DATE ║ FIRST ║
╠═══════════╬════════════╬═══════╣
║ 1 ║ 2013-05-31 ║ 1 ║
║ 1 ║ 2013-06-01 ║ 0 ║
║ 1 ║ 2013-06-02 ║ 0 ║
║ 15 ║ 2013-07-08 ║ 1 ║
║ 15 ║ 2013-07-09 ║ 0 ║
║ 1 ║ 2013-07-30 ║ 1 ║
║ 1 ║ 2013-07-31 ║ 0 ║
║ 1 ║ 2013-08-01 ║ 0 ║
╚═══════════╩════════════╩═══════╝
我需要由用於開始日期和結束日期爲每個系列的柱的新表。例如:
╔═══════════╦════════════╦════════════╗
║ person_id ║ START_DATE ║ END_DATE ║
╠═══════════╬════════════╬════════════╣
║ 1 ║ 2013-05-31 ║ 2013-06-02 ║
║ 15 ║ 2013-07-08 ║ 2013-07-09 ║
║ 1 ║ 2013-07-30 ║ 2013-08-01 ║
╚═══════════╩════════════╩════════════╝
有沒有可能不使用while循環? 我嘗試了一個while循環,但它的速度很慢。該表大約有100 000條記錄。
我嘗試的循環看起來類似下面:
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id('dbo.temp_table'))
drop table temp_table;
go
SELECT
[person_id],
[date],
[first],
0 AS Processed,
N = ROW_NUMBER() OVER (ORDER BY p_id, datum)
INTO temp_table
FROM [person_dates]
ORDER BY person_id, date
go
declare @N int
declare @N2 int
declare @P_ID int
declare @DATE varchar(10)
declare @DATE2 varchar(10)
declare @start_date datetime
declare @end_date datetime
While (Select Count(*) From temp_table Where Processed = 0 AND first=1) > 0
Begin
Select @N=N,@P_ID=person_id, @DATE=date From temp_table Where Processed = 0 AND first=1 ORDER BY N
set @start_date = CAST(@DATE as datetime)
set @[email protected]
while (SELECT COUNT(*) FROM temp_table Where Processed = 0 AND first<>1 and
CAST(date as datetime) = dateadd(day,1,CAST(@DATE2 as datetime)) and [email protected]_ID) > 0
Begin
Select @N2=N,@DATE2=date From temp_table Where Processed = 0 AND first<>1 and
CAST(date as datetime) = dateadd(day,1,CAST(DATE2 as datetime)) and [email protected]_ID ORDER BY N
Update temp_table Set Processed = 1 Where N = @N2
End
set @end_date=CAST(@DATE2 as datetime)
Update temp_table Set Processed = 1 Where N = @N
End
go
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id('dbo.temp_table'))
drop table temp_table;
go
爲什麼有兩排用'爲person_id = 1'在結果集中? –
什麼DBMS? SQL Server? – Kermit
@AndreyGordeev - 是一個如何確定結束日期08-01是否對應於07-30或05-31? – mikey