업데이트 : 또한 필터는
당신은 아마 배치 사이의 연결을 놓친 적이 ... 정렬 DESC + 누락 된?
CREATE TABLE t005 (
Batch int
,[DateTime] datetime2
,pg float
)
INSERT INTO t005 values (3160036, cast('2016-09-30 11:30:52' as datetime2), 11.83)
INSERT INTO t005 values (3160036, cast('2016-09-28 08:35:50' as datetime2), 11.85)
INSERT INTO t005 values (3160036, cast('2016-09-27 11:27:41' as datetime2), 11.92)
INSERT INTO t005 values (3160036, cast('2016-09-26 07:33:27' as datetime2), 12.18)
INSERT INTO t005 values (3160036, cast('2016-09-25 12:42:08' as datetime2), 18.16)
INSERT INTO t005 values (3160039, cast('2016-09-28 08:28:50' as datetime2), 18.4)
INSERT INTO t005 values (3160039, cast('2016-09-27 09:29:42' as datetime2), 53.59)
INSERT INTO t005 values (3160039, cast('2016-09-27 09:19:32' as datetime2), 52.73)
INSERT INTO t005 values (3160039, cast('2016-09-27 09:12:46' as datetime2), 52.99)
INSERT INTO t005 values (3160039, cast('2016-09-27 09:05:52' as datetime2), 53.08)
INSERT INTO t005 values (3160039, cast('2016-09-27 08:34:59' as datetime2), 47.17)
INSERT INTO t005 values (3160051, cast('2016-10-27 12:56:33' as datetime2), 11.31)
INSERT INTO t005 values (3160051, cast('2016-10-27 12:42:58' as datetime2), 11.17)
INSERT INTO t005 values (3160051, cast('2016-10-24 06:12:35' as datetime2), 11.18)
INSERT INTO t005 values (3160051, cast('2016-10-24 05:57:18' as datetime2), 11.13)
SELECT
T0.[Batch],
T0.[DateTime],
(SELECT TOP 1
T1.[DateTime]
FROM
t005 T1
WHERE T1.Batch = T0.Batch
AND T1.[DateTime] < T0.[DateTime]
ORDER BY T1.[DateTime] DESC) as LastDateTime,
ISNULL(DATEDIFF(day,(SELECT TOP 1
T1.[DateTime]
FROM
t005 T1
WHERE T1.Batch = T0.Batch
AND T1.[DateTime] < T0.[DateTime]
ORDER BY T1.[DateTime] DESC), T0.[DateTime]),0) AS [Days],
T0.[PG] AS [PG]
FROM t005 as T0
ORDER BY T0.[Batch],
T0.[DateTime]
--drop table t005
출력 : 배치의 첫 번째 실행에서
Batch |DateTime |LastDateTime |Days |PG
--------|----------------------------|-----------------------------|-----|----
3160036 |2016-09-25 12:42:08.0000000 |NULL |0 |18.16
3160036 |2016-09-26 07:33:27.0000000 |2016-09-25 12:42:08.0000000 |1 |12.18
3160036 |2016-09-27 11:27:41.0000000 |2016-09-26 07:33:27.0000000 |1 |11.92
3160036 |2016-09-28 08:35:50.0000000 |2016-09-27 11:27:41.0000000 |1 |11.85
3160036 |2016-09-30 11:30:52.0000000 |2016-09-28 08:35:50.0000000 |2 |11.83
3160039 |2016-09-27 08:34:59.0000000 |NULL |0 |47.17
3160039 |2016-09-27 09:05:52.0000000 |2016-09-27 08:34:59.0000000 |0 |53.08
3160039 |2016-09-27 09:12:46.0000000 |2016-09-27 09:05:52.0000000 |0 |52.99
3160039 |2016-09-27 09:19:32.0000000 |2016-09-27 09:12:46.0000000 |0 |52.73
3160039 |2016-09-27 09:29:42.0000000 |2016-09-27 09:19:32.0000000 |0 |53.59
3160039 |2016-09-28 08:28:50.0000000 |2016-09-27 09:29:42.0000000 |1 |18.4
3160051 |2016-10-24 05:57:18.0000000 |NULL |0 |11.13
3160051 |2016-10-24 06:12:35.0000000 |2016-10-24 05:57:18.0000000 |0 |11.18
3160051 |2016-10-27 12:42:58.0000000 |2016-10-24 06:12:35.0000000 |3 |11.17
3160051 |2016-10-27 12:56:33.0000000 |2016-10-27 12:42:58.0000000 |0 |11.31
쿼리 시간 :
SELECT
T0.[Batch],
T0.[DateTime],
(SELECT TOP 1
T1.[DateTime]
FROM
t005 T1
WHERE T1.Batch = T0.Batch
AND T1.[DateTime] < T0.[DateTime]
ORDER BY T1.[DateTime] ASC) as LastDateTime,
ISNULL(DATEDIFF(day,(SELECT TOP 1
T1.[DateTime]
FROM
t005 T1
WHERE T1.Batch = T0.Batch
AND T1.[DateTime] < T0.[DateTime]
ORDER BY T1.[DateTime] ASC), T0.[DateTime]),0) AS [Days],
T0.[PG] AS [PG]
FROM t005 as T0
ORDER BY T0.[Batch],
T0.[DateTime]
출력 :별로 파티션을 사용
Batch |DateTime |LastDateTime |Days |PG
--------|----------------------------|----------------------------|------|-------
3160036 |2016-09-25 12:42:08.0000000 |NULL |0 |18,16
3160036 |2016-09-26 07:33:27.0000000 |2016-09-25 12:42:08.0000000 |1 |12,18
3160036 |2016-09-27 11:27:41.0000000 |2016-09-25 12:42:08.0000000 |2 |11,92
3160036 |2016-09-28 08:35:50.0000000 |2016-09-25 12:42:08.0000000 |3 |11,85
3160036 |2016-09-30 11:30:52.0000000 |2016-09-25 12:42:08.0000000 |5 |11,83
3160039 |2016-09-27 08:34:59.0000000 |NULL |0 |47,17
3160039 |2016-09-27 09:05:52.0000000 |2016-09-27 08:34:59.0000000 |0 |53,08
3160039 |2016-09-27 09:12:46.0000000 |2016-09-27 08:34:59.0000000 |0 |52,99
3160039 |2016-09-27 09:19:32.0000000 |2016-09-27 08:34:59.0000000 |0 |52,73
3160039 |2016-09-27 09:29:42.0000000 |2016-09-27 08:34:59.0000000 |0 |53,59
3160039 |2016-09-28 08:28:50.0000000 |2016-09-27 08:34:59.0000000 |1 |18,4
3160051 |2016-10-24 05:57:18.0000000 |NULL |0 |11,13
3160051 |2016-10-24 06:12:35.0000000 |2016-10-24 05:57:18.0000000 |0 |11,18
3160051 |2016-10-27 12:42:58.0000000 |2016-10-24 05:57:18.0000000 |3 |11,17
3160051 |2016-10-27 12:56:33.0000000 |2016-10-24 05:57:18.0000000 |3 |11,31
유사 용액 .. .
SELECT a.* , datediff(day,LastDate,a.[DateTime]) as Diff
FROM (
SELECT
T0.[Batch],
T0.[DateTime],
MIN(T0.[DateTime]) OVER (PARTITION BY T0.[Batch]) as LastDate,
T0.[PG] AS [PG]
FROM t005 as T0
) as a
ORDER BY a.[Batch],
a.[DateTime]
현재 코드는 일괄 처리의 시작 시간에서부터 가장 최근 시작 시간까지의 일괄 처리 일 수를 제공합니다. 다르게하기를 원하는 것이 무엇입니까? – Ben
아니요, 그렇지 않습니다. 샘플 결과를 보면 배치 3160039가 27 일에 시작되었습니다. 첫 번째 입장은 0 일이라고 말해야하지만 25 일에 시작된 다른 배치 (3160036)가 있었기 때문에 2 일이라고 말합니다. 배치 3160051의 마지막 항목은 3 일이라고 말하지만 32라고 표시됩니다. – coblenski