2016-11-28 2 views
14

Я пытаюсь вычислить столбец TO_DATE для группы BINGID, INDUSID, COMP1.Расчет с использованием функции Date в SQL Server 2008

Когда IsRowActive = 1 затем TO_DATE = "9999-12-31", который возвращается правильно.

Но когда IsRowActive = 0, то мы должны вычислить To_Date, которое должно быть 1 сек меньше, чем на следующий FROMDT

данных:

DECLARE @MYTABLE TABLE 

(
BINGID INT, 
INDUSID INT, 
DTSEARCH DATETIME2, 
COMP1 VARCHAR (100), 
LISTPRICE NUMERIC(10,2), 
FROMDT DATETIME2, 
IsRowActive INT 

) 
INSERT @MYTABLE 

SELECT 1002285, 1002, '2016-03-03 04:10:58.0000000', '0026PU009163-031', '77.7600', '2015-12-19 12:51:49.0000000',0 UNION ALL 
SELECT 1002285, 1002, '2016-05-27 12:14:53.0000000', '0026PU009163-031', '85.2200', '2016-05-27 12:14:53.0000000',0 UNION ALL 
SELECT 1002285, 1002, '2016-07-20 06:44:37.0000000', '0026PU009163-031', '90.3900', '2016-07-20 06:44:37.0000000',0 UNION ALL 
SELECT 1002285, 1002, '2016-11-09 13:37:13.0000000', '0026PU009163-031', '131.4500', '2016-10-18 13:49:10.0000000',1 UNION ALL 
SELECT 1002285, 1002, '2015-12-19 12:51:41.0000000', '10122374', 65.1400, '2015-12-19 12:51:41.0000000', 0 UNION ALL 
SELECT 1002285, 1002, '2016-03-03 04:11:01.0000000', '10122374', 117.2100, '2016-03-03 04:11:01.0000000', 0 UNION ALL 
SELECT 1002285, 1002, '2016-05-27 12:14:45.0000000', '10122374', 53.5500, '2016-05-27 12:14:45.0000000', 0 UNION ALL 
SELECT 1002285, 1002, '2016-07-20 06:44:29.0000000', '10122374', 48.5000, '2016-07-20 06:44:29.0000000', 0 UNION ALL 
SELECT 1002285, 1002, '2016-10-18 13:49:00.0000000', '10122374', 75.6800, '2016-10-18 13:49:00.0000000', 0 UNION ALL 
SELECT 1002285, 1002, '2016-11-09 13:37:02.0000000', '10122374', 68.2400, '2016-11-09 13:37:02.0000000', 1 UNION ALL 

SELECT 1000001, 1002, '2016-03-03 02:22:09.0000000', '161GDB1577', 37.1700, '2015-12-18 06:45:05.0000000',0 UNION ALL 
SELECT 1000001, 1002, '2016-03-03 02:22:18.0000000', '0392347402', 41.9100, '2015-12-18 06:45:14.0000000',0 UNION ALL 
SELECT 1000001, 1002, '2016-05-26 14:54:28.0000000', '161GDB1577', 46.7100, '2016-05-26 14:54:28.0000000',0 UNION ALL 
SELECT 1000001, 1002, '2016-05-26 14:54:42.0000000', '0392347402', 54.7100, '2016-05-26 14:54:42.0000000',0 UNION ALL 
SELECT 1000001, 1002, '2016-07-15 06:34:33.0000000', '161GDB1577', 52.4800, '2016-07-15 06:34:33.0000000',0 UNION ALL 
SELECT 1000001, 1002, '2016-07-15 06:34:45.0000000', '0392347402', 81.7100, '2016-07-15 06:34:45.0000000',0 UNION ALL 
SELECT 1000001, 1002, '2016-10-17 11:26:45.0000000', '161GDB1577', 61.6400, '2016-10-17 11:26:45.0000000',0 UNION ALL 
SELECT 1000001, 1002, '2016-11-09 02:21:17.0000000', '0392347402', 81.9200, '2016-10-17 11:26:58.0000000',1 UNION ALL 
SELECT 1000001, 1002, '2016-11-09 02:21:05.0000000', '161GDB1577', 78.3500, '2016-11-09 02:21:05.0000000',1 UNION ALL 
SELECT 1000005, 1002, '2018-11-09 02:21:05.0000000', '556556GHB', 78.3500, '2018-11-09 02:21:05.0000000',1 

Query я попробовал - к сожалению, она возвращает неверные данные:

SELECT 
    BINGID, INDUSID, DTSEARCH, 
    COMP1, LISTPRICE, FROMDT, 
    CASE 
     WHEN IsRowActive = 1 
      THEN '9999-12-31' 
      ELSE TO_DATE 
    END AS TO_DATE, 
    IsRowActive 
FROM 
    @MYTABLE mt 
OUTER APPLY 
    (SELECT 
     MAX(DATEADD(second, -1, FROMDT)) TO_DATE 
    FROM 
     @MYTABLE mt2 
    WHERE 
     mt2.BINGID = mt.BINGID 
     AND mt2.INDUSID = mt.INDUSID 
     AND mt2.FROMDT > mt.FROMDT) oa 
WHERE 
    mt.INDUSID = '1002' 

Ожидаемый результат

BINGID INDUSID DTSEARCH COMP1 LISTPRICE FROMDT NEW_TO_DATE IsRowCurrent 
1000001 1002 2016-03-03 02:22:09.0000000 161GDB1577 37.1700 2015-12-18 06:45:05.0000000 2016-05-26 14:54:27.0000000 0 
1000001 1002 2016-03-03 02:22:18.0000000 0392347402 41.9100 2015-12-18 06:45:14.0000000 2016-05-26 14:54:41.0000000 0 
1000001 1002 2016-05-26 14:54:28.0000000 161GDB1577 46.7100 2016-05-26 14:54:28.0000000 2016-07-15 06:34:32.0000000 0 
1000001 1002 2016-05-26 14:54:42.0000000 0392347402 54.7100 2016-05-26 14:54:42.0000000 2016-07-15 06:34:44.0000000 0 
1000001 1002 2016-07-15 06:34:33.0000000 161GDB1577 52.4800 2016-07-15 06:34:33.0000000 2016-10-17 11:26:44.0000000 0 
1000001 1002 2016-07-15 06:34:45.0000000 0392347402 81.7100 2016-07-15 06:34:45.0000000 2016-10-17 11:26:57.0000000 0 
1000001 1002 2016-10-17 11:26:45.0000000 161GDB1577 61.6400 2016-10-17 11:26:45.0000000 2016-11-09 02:21:04.0000000 0 
1000001 1002 2016-11-09 02:21:17.0000000 0392347402 81.9200 2016-10-17 11:26:58.0000000 9999-12-31 00:00:00.0000000 1 
1000001 1002 2016-11-09 02:21:05.0000000 161GDB1577 78.3500 2016-11-09 02:21:05.0000000 9999-12-31 00:00:00.0000000 1 
1000005 1002 2018-11-09 02:21:05.0000000 556556GHB 78.3500 2018-11-09 02:21:05.0000000 9999-12-31 00:00:00.0000000 1 
1002285, 1002, '2016-03-03 04:10:58.0000000', '0026PU009163-031', '77.7600', 2015-12-19 12:51:49.0000000' 2016-05-27 12:14:52.0000000' 0 
1002285, 1002, '2016-05-27 12:14:53.0000000', '0026PU009163-031', '85.2200', 2016-05-27 12:14:53.0000000' 2016-07-20 06:44:36.0000000' 0 
1002285, 1002, '2016-07-20 06:44:37.0000000', '0026PU009163-031', '90.3900', 2016-07-20 06:44:37.0000000' 2016-10-18 13:49:09.0000000' 0 
1002285, 1002, '2016-11-09 13:37:13.0000000', '0026PU009163-031', '131.4500', 2016-10-18 13:49:10.0000000' 9999-12-31 00:00:00.0000000 1 
1002285, 1002, '2015-12-19 12:51:41.0000000', '10122374', 65.1400, '2015-12-19 12:51:41.0000000', 2016-03-03 04:11:00.0000000', 0 
1002285, 1002, '2016-03-03 04:11:01.0000000', '10122374', 117.2100, '2016-03-03 04:11:01.0000000', 2016-05-27 12:14:44.0000000', 0 
1002285, 1002, '2016-05-27 12:14:45.0000000', '10122374', 53.5500, '2016-05-27 12:14:45.0000000', 2016-07-20 06:44:28.0000000', 0 
1002285, 1002, '2016-07-20 06:44:29.0000000', '10122374', 48.5000, '2016-07-20 06:44:29.0000000', 2016-10-18 13:48:59.0000000', 0 
1002285, 1002, '2016-10-18 13:49:00.0000000', '10122374', 75.6800, '2016-10-18 13:49:00.0000000', 2016-11-09 13:37:01.0000000', 0 
1002285, 1002, '2016-11-09 13:37:02.0000000', '10122374', 68.2400, '2016-11-09 13:37:02.0000000', 9999-12-31 00:00:00.0000000 1 

Спасибо.

+5

КПП: Это хороший вопрос! Скопированный сценарий сценария, собственное усилие, ожидаемый результат ... +1 с моей стороны – Shnugo

+0

@ Rohini Mathur Ожидаемый результат требует любого порядка, или как он. или я получил результат, но заказ sequnce только пропустил совпадение. –

ответ

1
DECLARE @MYTABLE TABLE 
(
BINGID int, 
INDUSID int, 
DTSEARCH datetime2, 
COMP1 varchar(100), 
LISTPRICE numeric(15,5),  
FROMDT datetime2, 
IsRowActive int 

) 
insert @MYTABLE 

SELECT 1002285 ,1002 ,'2016-03-03 04:10:58.0000000', '0026PU009163-031', 77.7600 ,'2015-12-19 12:51:49.0000000', 0 UNION ALL 
SELECT 1002285 ,1002 ,'2016-05-27 12:14:53.0000000', '0026PU009163-031', 85.2200 ,'2016-05-27 12:14:53.0000000', 0 UNION ALL 
SELECT 1002285 ,1002 ,'2016-07-20 06:44:37.0000000', '0026PU009163-031', 90.3900 ,'2016-07-20 06:44:37.0000000', 0 UNION ALL 
SELECT 1002285 ,1002 ,'2016-11-09 13:37:13.0000000', '0026PU009163-031', 131.4500,'2016-07-20 06:44:37.0000000', 1 


select BINGID,DTSEARCH,COMP1,LISTPRICE,FROMDT,CASE WHEN IsRowActive = 0 THEN lead(DATEADD(SS,-1,FROMDT)) OVER (ORDER BY FROMDT) ELSE '9999-12-31' END AS expected_date 

FROM @MYTABLE mt 

выход

BINGID DTSEARCH COMP1 LISTPRICE FROMDT expected_date 
1002285 2016-03-03 04:10:58.0000000 0026PU009163-031 77.76000 2015-12-19 12:51:49.0000000 2016-05-27 12:14:52.0000000 
1002285 2016-05-27 12:14:53.0000000 0026PU009163-031 85.22000 2016-05-27 12:14:53.0000000 2016-07-20 06:44:36.0000000 
1002285 2016-07-20 06:44:37.0000000 0026PU009163-031 90.39000 2016-07-20 06:44:37.0000000 2016-07-20 06:44:36.0000000 
1002285 2016-11-09 13:37:13.0000000 0026PU009163-031 131.45000 2016-07-20 06:44:37.0000000 9999-12-31 00:00:00.0000000 
+0

Спасибо, но это не дает правильного результата. TO_DATE должен быть на 1 секунду меньше, чем следующий FMDT. –

+2

'LEAD' недоступен в SQL Server 2008. –

+0

я отредактировал свой ответ, можно проверить один раз ... @ RohiniMathur – Chanukya

2

Попробуйте это простое и читаемое решение, используйте CTE и Self Join

with cte as 
( 
    SELECT 
    ROW_NUMBER() over (order by BINGID,INDUSID,DTSEARCH,COMP1,LISTPRICE,FROMDT) 
     as rowno, -- It is good if you have identity column here 
     BINGID, 
     INDUSID,  
     DTSEARCH, 
     COMP1, 
     LISTPRICE, 
     FROMDT, 
     IsRowActive 
     FROM @MYTABLE mt 
) 
select c1.*, 
CASE WHEN c1.IsRowActive = 1 THEN '9999-12-31' ELSE DATEADD(second, -1, c2.FROMDT) END 
AS TO_DATE 
from cte c1 left join cte c2 
on c1.rowno+1 = c2.rowno 
+0

проголосовали. Для простого решения попробуйте. но все же пропустить матч в результатах. –

+0

Что вам не хватает? По вашему вопросу я получил тот же результат. – Munavvar

+0

проверьте с другими данными примера, перечисленными ниже в комментариях. –

1

Вместо MAX использования TOP(1) с соответствующим ORDER BY в OUTER APPLY.

Кроме того, вы сказали, что хотите группировать BINGID, INDUSID, COMP1, поэтому используйте все эти столбцы в разделе WHERE в OUTER APPLY. Почему вы опустили COMP1 в своем запросе?

Выборочные данные

DECLARE @MYTABLE TABLE 
(
    BINGID INT, 
    INDUSID INT, 
    DTSEARCH DATETIME2, 
    COMP1 VARCHAR (100), 
    LISTPRICE NUMERIC(10,2), 
    FROMDT DATETIME2, 
    IsRowActive INT 
) 

INSERT INTO @MYTABLE 
SELECT 1002285, 1002, '2016-03-03 04:10:58', '0026PU009163-031', 77.7600, '2015-12-19 12:51:49', 0 UNION ALL 
SELECT 1002285, 1002, '2016-05-27 12:14:53', '0026PU009163-031', 85.2200, '2016-05-27 12:14:53', 0 UNION ALL 
SELECT 1002285, 1002, '2016-07-20 06:44:37', '0026PU009163-031', 90.3900, '2016-07-20 06:44:37', 0 UNION ALL 
SELECT 1002285, 1002, '2016-11-09 13:37:13', '0026PU009163-031', 131.4500, '2016-10-18 13:49:10', 1 UNION ALL 
SELECT 1002285, 1002, '2015-12-19 12:51:41', '10122374',   65.1400, '2015-12-19 12:51:41', 0 UNION ALL 
SELECT 1002285, 1002, '2016-03-03 04:11:01', '10122374',   117.2100, '2016-03-03 04:11:01', 0 UNION ALL 
SELECT 1002285, 1002, '2016-05-27 12:14:45', '10122374',   53.5500, '2016-05-27 12:14:45', 0 UNION ALL 
SELECT 1002285, 1002, '2016-07-20 06:44:29', '10122374',   48.5000, '2016-07-20 06:44:29', 0 UNION ALL 
SELECT 1002285, 1002, '2016-10-18 13:49:00', '10122374',   75.6800, '2016-10-18 13:49:00', 0 UNION ALL 
SELECT 1002285, 1002, '2016-11-09 13:37:02', '10122374',   68.2400, '2016-11-09 13:37:02', 1 UNION ALL 
SELECT 1000001, 1002, '2016-03-03 02:22:09', '161GDB1577',  37.1700, '2015-12-18 06:45:05', 0 UNION ALL 
SELECT 1000001, 1002, '2016-03-03 02:22:18', '0392347402',  41.9100, '2015-12-18 06:45:14', 0 UNION ALL 
SELECT 1000001, 1002, '2016-05-26 14:54:28', '161GDB1577',  46.7100, '2016-05-26 14:54:28', 0 UNION ALL 
SELECT 1000001, 1002, '2016-05-26 14:54:42', '0392347402',  54.7100, '2016-05-26 14:54:42', 0 UNION ALL 
SELECT 1000001, 1002, '2016-07-15 06:34:33', '161GDB1577',  52.4800, '2016-07-15 06:34:33', 0 UNION ALL 
SELECT 1000001, 1002, '2016-07-15 06:34:45', '0392347402',  81.7100, '2016-07-15 06:34:45', 0 UNION ALL 
SELECT 1000001, 1002, '2016-10-17 11:26:45', '161GDB1577',  61.6400, '2016-10-17 11:26:45', 0 UNION ALL 
SELECT 1000001, 1002, '2016-11-09 02:21:17', '0392347402',  81.9200, '2016-10-17 11:26:58', 1 UNION ALL 
SELECT 1000001, 1002, '2016-11-09 02:21:05', '161GDB1577',  78.3500, '2016-11-09 02:21:05', 1 UNION ALL 
SELECT 1000005, 1002, '2018-11-09 02:21:05', '556556GHB',   78.3500, '2018-11-09 02:21:05', 1 

Запрос

SELECT 
    BINGID, 
    INDUSID, 
    DTSEARCH, 
    COMP1, 
    LISTPRICE, 
    FROMDT, 
    CASE WHEN IsRowActive = 1 THEN '9999-12-31' ELSE oa.TO_DATE END AS TO_DATE, 
    IsRowActive 
FROM 
    @MYTABLE AS mt 
    OUTER APPLY 
    ( 
     SELECT TOP(1) DATEADD(second, -1, FROMDT) AS TO_DATE 
     FROM @MYTABLE AS mt2 
     WHERE 
      mt2.BINGID = mt.BINGID 
      AND mt2.INDUSID = mt.INDUSID 
      AND mt2.COMP1 = mt.COMP1 
      AND mt2.FROMDT > mt.FROMDT 
     ORDER BY mt2.FROMDT 
    ) AS oa 
WHERE 
    mt.INDUSID = '1002' 
ORDER BY BINGID, INDUSID, COMP1, FROMDT; 

Результат

+---------+---------+-----------------------------+------------------+-----------+-----------------------------+-----------------------------+-------------+ 
| BINGID | INDUSID |   DTSEARCH   |  COMP1  | LISTPRICE |   FROMDT   |   TO_DATE   | IsRowActive | 
+---------+---------+-----------------------------+------------------+-----------+-----------------------------+-----------------------------+-------------+ 
| 1000001 | 1002 | 2016-03-03 02:22:18.0000000 | 0392347402  | 41.91  | 2015-12-18 06:45:14.0000000 | 2016-05-26 14:54:41.0000000 |   0 | 
| 1000001 | 1002 | 2016-05-26 14:54:42.0000000 | 0392347402  | 54.71  | 2016-05-26 14:54:42.0000000 | 2016-07-15 06:34:44.0000000 |   0 | 
| 1000001 | 1002 | 2016-07-15 06:34:45.0000000 | 0392347402  | 81.71  | 2016-07-15 06:34:45.0000000 | 2016-10-17 11:26:57.0000000 |   0 | 
| 1000001 | 1002 | 2016-11-09 02:21:17.0000000 | 0392347402  | 81.92  | 2016-10-17 11:26:58.0000000 | 9999-12-31 00:00:00.0000000 |   1 | 
| 1000001 | 1002 | 2016-03-03 02:22:09.0000000 | 161GDB1577  | 37.17  | 2015-12-18 06:45:05.0000000 | 2016-05-26 14:54:27.0000000 |   0 | 
| 1000001 | 1002 | 2016-05-26 14:54:28.0000000 | 161GDB1577  | 46.71  | 2016-05-26 14:54:28.0000000 | 2016-07-15 06:34:32.0000000 |   0 | 
| 1000001 | 1002 | 2016-07-15 06:34:33.0000000 | 161GDB1577  | 52.48  | 2016-07-15 06:34:33.0000000 | 2016-10-17 11:26:44.0000000 |   0 | 
| 1000001 | 1002 | 2016-10-17 11:26:45.0000000 | 161GDB1577  | 61.64  | 2016-10-17 11:26:45.0000000 | 2016-11-09 02:21:04.0000000 |   0 | 
| 1000001 | 1002 | 2016-11-09 02:21:05.0000000 | 161GDB1577  | 78.35  | 2016-11-09 02:21:05.0000000 | 9999-12-31 00:00:00.0000000 |   1 | 
| 1000005 | 1002 | 2018-11-09 02:21:05.0000000 | 556556GHB  | 78.35  | 2018-11-09 02:21:05.0000000 | 9999-12-31 00:00:00.0000000 |   1 | 
| 1002285 | 1002 | 2016-03-03 04:10:58.0000000 | 0026PU009163-031 | 77.76  | 2015-12-19 12:51:49.0000000 | 2016-05-27 12:14:52.0000000 |   0 | 
| 1002285 | 1002 | 2016-05-27 12:14:53.0000000 | 0026PU009163-031 | 85.22  | 2016-05-27 12:14:53.0000000 | 2016-07-20 06:44:36.0000000 |   0 | 
| 1002285 | 1002 | 2016-07-20 06:44:37.0000000 | 0026PU009163-031 | 90.39  | 2016-07-20 06:44:37.0000000 | 2016-10-18 13:49:09.0000000 |   0 | 
| 1002285 | 1002 | 2016-11-09 13:37:13.0000000 | 0026PU009163-031 | 131.45 | 2016-10-18 13:49:10.0000000 | 9999-12-31 00:00:00.0000000 |   1 | 
| 1002285 | 1002 | 2015-12-19 12:51:41.0000000 | 10122374   | 65.14  | 2015-12-19 12:51:41.0000000 | 2016-03-03 04:11:00.0000000 |   0 | 
| 1002285 | 1002 | 2016-03-03 04:11:01.0000000 | 10122374   | 117.21 | 2016-03-03 04:11:01.0000000 | 2016-05-27 12:14:44.0000000 |   0 | 
| 1002285 | 1002 | 2016-05-27 12:14:45.0000000 | 10122374   | 53.55  | 2016-05-27 12:14:45.0000000 | 2016-07-20 06:44:28.0000000 |   0 | 
| 1002285 | 1002 | 2016-07-20 06:44:29.0000000 | 10122374   | 48.50  | 2016-07-20 06:44:29.0000000 | 2016-10-18 13:48:59.0000000 |   0 | 
| 1002285 | 1002 | 2016-10-18 13:49:00.0000000 | 10122374   | 75.68  | 2016-10-18 13:49:00.0000000 | 2016-11-09 13:37:01.0000000 |   0 | 
| 1002285 | 1002 | 2016-11-09 13:37:02.0000000 | 10122374   | 68.24  | 2016-11-09 13:37:02.0000000 | 9999-12-31 00:00:00.0000000 |   1 | 
+---------+---------+-----------------------------+------------------+-----------+-----------------------------+-----------------------------+-------------+ 
+0

Спасибо, но я ищу, чтобы иметь значение как «2016-07-20 06: 44: 36.0000000» в третьем TO_DATE вместо NULL. –

+0

@RohiniMathur, пожалуйста, объясните, какая логика должна быть там, если нет «следующей» строки. –

+0

Когда нет следующей строки Than Это сделал расчет из столбца «IsRowActive = 1». Таким образом, вычисление будет выполнено в столбце FROMDT, где TO_DATE = 9999-12-31 00: 00: 00.0000000 –

2

мне очень нравится @ answe Chanukya в р. Но поскольку вы используете 2008, вы не сможете использовать функцию LEAD. Вместо этого, вы можете использовать автообъединение:

-- SQL Server 2008. 
SELECT 
    c.*, 
    CASE c.IsRowActive 
     WHEN 1 THEN '9999-12-31' 
     ELSE DATEADD(SECOND, -1, MIN(p.FROMDT)) 
    END AS TO_DATE 
FROM 
    @MYTABLE AS c 
     LEFT OUTER JOIN @MYTABLE AS p  ON p.BINGID = c.BINGID 
              AND p.INDUSID = c.INDUSID 
              AND p.FROMDT > c.FROMDT 
GROUP BY 
    c.BINGID, 
    c.INDUSID, 
    c.DTSEARCH, 
    c.COMP1, 
    c.LISTPRICE, 
    c.FROMDT, 
    c.IsRowActive 
ORDER BY 
    c.FROMDT 
; 

Логика похожа на ваш внешний примениться, но он должен работать лучше. Это потому, что нет correlation.

Данные примера представляют собой небольшую проблему. Поскольку есть две записи с FROMDT из 2016-07-20 06:44:37.0000000, вы можете утверждать, что мои результаты ошибочны.

+0

Спасибо @ Владимир Баранов. Вы правы, моя попытка была ужасной. Обновить для исправления. Как и ваш ответ, хорошо написано. Легко следить. –

-1

Использование CTE + Соединения:

Наконец, решение здесь. Данные результата окончательно точны в соответствии с вашим требованием, вы также можете изменить последовательность, используя порядок, по имени столбца.

Код:

 with cte as 
       ( 
         SELECT 
         ROW_NUMBER() OVER (partition by COMP1 ORDER BY (SELECT 1)) 
         rowno, 
         BINGID, 
         INDUSID,  
         DTSEARCH, 
         COMP1, 
         LISTPRICE, 
         FROMDT, 
         IsRowActive 
         FROM @MYTABLE mt 
       ) 
       select c1.BINGID,c1.INDUSID, c1.DTSEARCH, c1.COMP1, c1.LISTPRICE, c1.FROMDT, c1.IsRowActive, 
       CASE WHEN c1.IsRowActive = 1 THEN '9999-12-31' ELSE case when (c2.rowno is null) THEN '9999-12-31' 
       else DATEADD(second, -1, coalesce(c2.FROMDT,'9999-12-31')) End END 
       AS TO_DATE 
       from cte c1 left join cte c2 
       on c1.rowno+1= c2.rowno and c1.COMP1=c2.COMP1 

       order by c1.BINGID,DTSEARCH 

также проверить Demo.

+0

Жаль мистера Бхосале. Это не дает правильного результата. Там были 2 ошибки, 1-я: таблица имеет только 2000 записей, но на выходе она дает 5000 записей, вторая: дает 9999-12-31 00: 00: 00.0000000 для четного IsRowActive = '0' –

+0

, но работает над образцами данных, которые вы дали. –

+0

Могу ли я расширить данные выборки с ожидаемым выходом –

Смежные вопросы