2016-11-02 1 views
0

거슬러 올라간다. 나는 단 하나의 배치 만 있다면 내가 가지고있는 것이 작동 할 것이라고 확신하지만 동시에 여러 번 사용하면 분명히 원하는대로 작동하지 않을 것입니다.SQL의 DATEDIFF 내가이 <code>DATEDIFF</code>을 사용하여 시작된 이후 일괄 처리가 진행되고있다 얼마나 많은 일을 계산하기 위해 노력하고있어

내가 가진 문제는 여러 일괄 있다는 것을, 그리고 각 배치는 다른 시작 날짜가 있습니다. 따라서 사용 시작 날짜를 선택할 때 어느 특정 배치를 고려해야하는지 계산하려면 계산이 필요합니다. 지금은 일괄 처리에 관계없이 테이블에서 가장 오래된 날짜를 사용하고 있습니다.

SELECT 
    T0.[Batch], 
    T0.[DateTime], 
    DATEDIFF(day, (SELECT TOP 1 T0.[DateTime] 
        FROM t005 T0 
        ORDER BY T0.[DateTime]), T0.[DateTime]) AS [Days], 
    MAX(T0.[PG]) AS [PG] 
FROM 
    t005 T0 

결과는 다음과 같다 :

Batch   DateTime    Days PG 
3160036 2016-09-30 11:30:52.000 5 11.83 
3160036 2016-09-28 08:35:50.000 3 11.85 
3160036 2016-09-27 11:27:41.000 2 11.92 
3160036 2016-09-26 07:33:27.000 1 12.18 
3160036 2016-09-25 12:42:08.000 0 18.16 


3160039 2016-09-28 08:28:50.000 3 18.4 
3160039 2016-09-27 09:29:42.000 2 53.59 
3160039 2016-09-27 09:19:32.000 2 52.73 
3160039 2016-09-27 09:12:46.000 2 52.99 
3160039 2016-09-27 09:05:52.000 2 53.08 
3160039 2016-09-27 08:34:59.000 2 47.17 

3160051 2016-10-27 12:56:33.000 32 11.31 
3160051 2016-10-27 12:42:58.000 32 11.17 
3160051 2016-10-24 06:12:35.000 29 11.18 
3160051 2016-10-24 05:57:18.000 29 11.13 

많은 감사합니다.

+1

현재 코드는 일괄 처리의 시작 시간에서부터 가장 최근 시작 시간까지의 일괄 처리 일 수를 제공합니다. 다르게하기를 원하는 것이 무엇입니까? – Ben

+0

아니요, 그렇지 않습니다. 샘플 결과를 보면 배치 3160039가 27 일에 시작되었습니다. 첫 번째 입장은 0 일이라고 말해야하지만 25 일에 시작된 다른 배치 (3160036)가 있었기 때문에 2 일이라고 말합니다. 배치 3160051의 마지막 항목은 3 일이라고 말하지만 32라고 표시됩니다. – coblenski

답변

1

업데이트 : 또한 필터는

당신은 아마 배치 사이의 연결을 놓친 적이 ... 정렬 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] 
+0

제안 해 주셔서 감사합니다. 나는 그것을 시도했지만 나는 모든 결과에 대해 0 일을 얻는다. – coblenski

+0

일부 코드를 변경하고 테스트 스크립트를 추가했습니다.이 코드가 작동하는지 알려주세요. – tgr

+0

Incredible. 고마워요! – coblenski

관련 문제