Транспонировать таблицу с записями даты и времени в SQL Server - PullRequest
0 голосов
/ 11 января 2019

Я хочу переставить временную таблицу (столбец Result имеет DATETIME тип данных) ниже, чтобы агрегировать записи на основе значений MeasureDSC (создайте два новых столбца: First и Next).

Я использую Microsoft SQL Server 2017 (v14.0.17224.0) и Management Studio.

Текущая таблица:

+-----------+----------+------------------+------------------+---------+------------+
|    vID    |   fID    |      RESULT      |     Recorded     | LineNBR | MeasureDSC |
+-----------+----------+------------------+------------------+---------+------------+
| 292837518 | 75174227 | 2018-01-01 12:53 | 2018-01-01 9:48  |       1 | First      |
| 292837518 | 75174227 | 2018-01-01 12:54 | 2018-01-01 9:48  |       1 | Next       |
| 295376471 | 76107803 | 2018-01-01 22:51 | 2018-01-01 23:03 |       1 | First      |
| 295376471 | 76107803 | 2018-01-01 22:51 | 2018-01-01 23:03 |       1 | Next       |
| 301032810 | 78252847 | 2018-01-01 13:24 | 2018-01-01 13:45 |       1 | First      |
| 301032810 | 78252847 | NULL             | 2018-01-01 13:45 |       1 | Next       |
| 301867286 | 78566265 | 2018-01-01 14:40 | 2018-01-01 15:00 |       1 | First      |
| 301867286 | 78566265 | 2018-01-01 14:50 | 2018-01-01 15:00 |       1 | Next       |
| 302791918 | 78917501 | 2018-01-01 15:01 | 2018-01-01 7:30  |       1 | First      |
| 302791918 | 78917501 | 2018-01-01 15:05 | 2018-01-01 7:30  |       1 | Next       |
| 304444538 | 79538091 | 2018-01-01 8:00  | 2018-01-01 8:00  |       1 | First      |
| 304444538 | 79538091 | 2018-01-01 8:04  | 2018-01-01 8:00  |       1 | Next       |
| 304478684 | 79550758 | 2018-01-01 14:30 | 2018-01-01 17:44 |       1 | First      |
| 304478684 | 79550758 | 2018-01-01 15:30 | 2018-01-01 17:44 |       1 | Next       |
+-----------+----------+------------------+------------------+---------+------------+

Ожидаемый результат должен быть таким:

+-----------+----------+------------------+------------------+------------------+
|    vID    |   fID    |     Recorded     |      First       |       Next       |
+-----------+----------+------------------+------------------+------------------+
| 292837518 | 75174227 | 2018-01-01 9:48  | 2018-01-01 12:53 | 2018-01-01 12:54 |
| 295376471 | 76107803 | 2018-01-01 23:03 | 2018-01-01 22:51 | 2018-01-01 22:51 |
| 301032810 | 78252847 | 2018-01-01 13:45 | 2018-01-01 13:24 | NULL             |
| 301867286 | 78566265 | 2018-01-01 15:00 | 2018-01-01 14:40 | 2018-01-01 14:50 |
| 302791918 | 78917501 | 2018-01-01 7:30  | 2018-01-01 15:01 | 2018-01-01 15:05 |
| 304444538 | 79538091 | 2018-01-01 8:00  | 2018-01-01 8:00  | 2018-01-01 8:04  |
| 304478684 | 79550758 | 2018-01-01 17:44 | 2018-01-01 14:30 | 2018-01-01 15:30 |
+-----------+----------+------------------+------------------+------------------+

Я пытался использовать функцию PIVOT, но постоянно получал сообщение об ошибке: «Неверное имя столбца« RESULT ».»

Мой код:

SELECT 
    vID, fID,
    RESULT,
    Recorded,
    [First] AS [First],
    [Next] AS [Next]
FROM 
    (SELECT 
         vID, fID, RESULT, Recorded, MeasureDSC
     FROM 
         #temp) x
PIVOT 
    (MAX(RESULT) FOR MeasureDSC IN ([First], [Next])) p

Буду признателен за любую помощь!

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Я бы просто использовал условную агрегацию:

select vID, fID, Recorded,
       max(case when MeasureDSC = 'First' then result end) as [First],
       max(case when MeasureDSC = 'Next' then result end) as [Next]
from #temp 
group by vID, fID, Recorded;

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

select vID, fID, Recorded,
       min(result) as [First],
       max(result) as [Next]
from #temp 
group by vID, fID, Recorded;
0 голосов
/ 11 января 2019

Попробуйте это:

with PTemp as
(
    select vID, fID, Recorded, MeasureDSC, RESULT from #temp
)
select vID,fID,Recorded,[First],[Next] from PTemp PIVOT (max(RESULT) for MeasureDSC in ([First],[Next])) as PivotTable;
0 голосов
/ 11 января 2019

Почему бы просто не выполнить агрегацию вместо:

SELECT vID, fID, Recorded,
       MAX(CASE WHEN MeasureDSC = 'First' THEN RESULT END) AS First,       
       MAX(CASE WHEN MeasureDSC = 'Next' THEN RESULT  END) AS Next
FROM #temp 
GROUP BY vID, fID, Recorded;
...