Получить значения даты из предыдущих строк, если они недоступны в текущей - PullRequest
0 голосов
/ 25 июня 2018

Мне нужно получить логику / запрос для следующей ситуации в SQL Server:

Last Updated                              Time
2018-06-21 23:09:21.947                 21-06-2018
2018-06-21 23:09:21.947                 23:09
2018-06-22 00:14:02.877                 23:15
2018-06-22 00:29:13.660                 22-06-2018
2018-06-22 00:29:13.660                 23:15
2018-06-22 00:41:20.773                 23-06-2018
2018-06-22 00:41:20.773                 23:20
2018-06-22 02:58:44.160                 23:22
2018-06-22 02:59:40.097                 23:25
2018-06-22 03:00:07.770                 23:28

У меня есть данные, как указано выше, и я хочу получить, как показано ниже:

Last Updated                            Time    Time/Date
2018-06-21 23:09:21.947            21-06-2018   21-06-2018 23:09
2018-06-22 00:14:02.877               23:15     21-06-2018 23:15
2018-06-22 00:29:13.660              22-06-2018 22-06-2018 23:15
2018-06-22 00:41:20.773              23-06-2018 23-06-2018 23:20
2018-06-22 02:58:44.160                 23:22   23-06-2018 23:22
2018-06-22 02:59:40.097                  23:25  23-06-2018 23:25
2018-06-22 03:00:07.770                 23:28   23-06-2018 23:28

Как указано выше, необходимо получить столбец Дата / время, если нет даты, получить предыдущую дату на основе последнего обновленного столбца.Мой первый вопрос, ура !!

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы можете сделать это, используя операции на основе множеств.Вот один из методов:

select t1.last_updated, t1.time,
       (t2.time + ' ' + t1.time) as time_date     
from t outer apply
     (select top (1) t2.*
      from t2
      where t2.time like '%-%-%'
            t2.last_updated <= t.last_updated
      order by t2.last_updated desc
     ) t2
where time like '%:%'
group by last_updated;
0 голосов
/ 25 июня 2018

Это полностью основано на ваших данных.Так что вы можете изменить его соответственно.

declare @RawData as Table
(
    LastUpdate DateTime,
    Time Varchar(20)
)

declare @Data as Table
(
    RowId int,
    LastUpdate DateTime,
    Time Varchar(20)
)

declare @FinalData as Table
(
    LastUpdate DateTime,
    Time Varchar(20),
    [DateTime] DateTime 
)

Insert into @RawData values ('2018-06-21 23:09:21.947','21-06-2018')
Insert into @RawData values ('2018-06-21 23:09:21.947','23:09')
Insert into @RawData values ('2018-06-22 00:14:02.877','23:15')
Insert into @RawData values ('2018-06-22 00:29:13.660','22-06-2018')
Insert into @RawData values ('2018-06-22 00:29:13.660','23:15')
Insert into @RawData values ('2018-06-22 00:41:20.773','23-06-2018')
Insert into @RawData values ('2018-06-22 00:41:20.773','23:20')
Insert into @RawData values ('2018-06-22 02:58:44.160','23:22')
Insert into @RawData values ('2018-06-22 02:59:40.097','23:25')
Insert into @RawData values ('2018-06-22 03:00:07.770','23:28')

insert into @Data
Select ROW_NUMBER() OVER(ORDER BY LastUpdate ASC), * from @RawData 

Declare @Count INT
SET @Count = (Select count(*) from @Data)

DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=@Count)
BEGIN
    Declare @Date varchar(10)
    Declare @FinalDate varchar(10)

    if((Select Len(trim(time)) from @data where RowId = @intFlag) =10)
    Begin
        SET @Date = (Select Convert(date, time, 104) from @data where RowId = @intFlag)
    end
    else
    Begin 
        if((select Len(trim(time)) from @Data where RowID = @intFlag -1 ) = 10)
        Begin
            insert into @FinalData
            Select LastUpdate, time, Convert(Datetime,@Date + ' ' + time) from @data where RowID = @intFlag
        End
        else
        Begin
            insert into @FinalData
            Select LastUpdate, time, Convert(Datetime,@Date + ' ' + time) from @data where RowID = @intFlag
        End

    End 
    SET @intFlag = @intFlag + 1
END

Select * from @FinalData

GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...