Дата Разница между первой (минимальной) датой с последующими последовательными датами до конца таблицы - PullRequest
0 голосов
/ 05 июня 2018

Моя базовая таблица со следующей структурой

  ID            DC_NO           DC_DATE     NOB    TAG_NO
110168  DC/NGO/270118/188   1/27/18 0:00    800  NGO/191217/17
110169  DC/NGO/270118/189   1/27/18 0:00    400  NGO/191217/17
110170  DC/NGO/270118/190   1/27/18 0:00    600  NGO/191217/17
110171  DC/NGO/270118/192   1/27/18 0:00    700  NGO/191217/17
110172  DC/NGO/270118/196   1/27/18 0:00    720  NGO/191217/17
110173  DC/NGO/290118/179   1/29/18 0:00    700  NGO/191217/17
110174  DC/NGO/290118/227   1/29/18 0:00    500  NGO/191217/17
110175  DC/NGO/300118/220   1/30/18 0:00    834  NGO/191217/17
110176  DC/NGO/300118/221   1/30/18 0:00    600  NGO/191217/17
110177  DC/NGO/300118/221   1/30/18 0:00    10   NGO/191217/17
110178  DC/NGO/020218/185   2/2/18 0:00     900  NGO/191217/17
110179  DC/NGO/020218/186   2/2/18 0:00     3    NGO/191217/17
110180  DC/NGO/050218/176   2/5/18 0:00     50   NGO/191217/17
110181  DC/NGO/050218/177   2/5/18 0:00     29   NGO/191217/17
110182  DC/NGO/050218/177   2/5/18 0:00     24   NGO/191217/17
110183  DC/NGO/060218/105   2/6/18 0:00     56   NGO/191217/17

Моя вероятная выходная таблица должна быть такой:

DAY    DC_DATE      NOB   ME
1    1/27/18 0:00   800   800
1    1/27/18 0:00   400   400
1    1/27/18 0:00   600   600
1    1/27/18 0:00   700   700
1    1/27/18 0:00   720   720
3    1/29/18 0:00   700   2100
3    1/29/18 0:00   500   1500
4    1/30/18 0:00   834   3336
4    1/30/18 0:00   600   2400
4    1/30/18 0:00   10    40
7    2/2/18 0:00    900   6300
7    2/2/18 0:00    3     21
10   2/5/18 0:00    50    500
10   2/5/18 0:00    29    290
10   2/5/18 0:00    24    240
11   2/6/18 0:00    56    616
           TOTAL   6926  20563

Я хочу назначить значение для первого dc_date должно быть 1xNOB (1x800 = 800) и вторая dc_date должна быть 3xNOB (3x700 = 2100), а третья dc_date должна быть 4xNOB (4x834 = 3336) и так далее до конца таблицы.

Если dc_date изменяется, значение DAY должно быть, вторая дата-первая дата + 1 (например, 29.01.18-27.01.18 = 2 + 1 = 3), а затем третья дата-первая дата + 1 (например, 30.01.18-27.01.18 = 3 + 1 = 4) и этот процесс продолжается до конца таблицы

** первая (MIN) дата - это базовая дата, всегда значение 1 и добавьте это значениепосле вычитания между двумя датами (например, 29.01-27.01 = 2 + 1, 30.01-27.01 = 3 + 1, 02.02-27.01 = 6 + 1, 05.02-27.01 = 9 + 1, 06.02-27.01 = 10 + 1)

Выходные данные, которые мне потребовались в запросе: «Всего ME» = 20563 и «Среднее ME» = 2,996 (ME / NOB) для базовой таблицы, упомянутой выше.

Я не хочу обновлятьбазовый стол.Пожалуйста, используйте запрос CTE.

Группировка по должна быть на DC_DATE и TAG_NO.Когда TAG_NO изменилось, значение DAY должно начинаться с начала еще раз.Поле NOB должно быть суммировано.

Я использую sql server 2012

1 Ответ

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

Вы можете попробовать это.

SELECT  
    DATEDIFF(DAY, MIN(DC_DATE) OVER(PARTITION BY TAG_NO), DC_DATE) + 1 DAY
    , DC_DATE
    , NOB
    , (DATEDIFF(DAY, MIN(DC_DATE) OVER(PARTITION BY TAG_NO), DC_DATE) + 1) * NOB AS ME
FROM [MyTable] 
...