Как преобразовать 5-минутные интервалы времени в 1-минутные интервалы в SQL, сохраняя другую информацию? - PullRequest
0 голосов
/ 06 февраля 2019

Я видел одну или две темы, спрашивающие об обратном (превращение отметки времени в 1 минуту в 5 минут или другие интервалы времени).Но я совершенно не понимаю, как программировать это.

Это моя входная таблица:

timestamp     Food      Beverage
15:00:00      Pizza      Coke
15:05:00      Burger     Coke
15:10:00      Hotdog     Pepsi
   …             …        …

И это будет вывод, который я хочу:

timestamp   Food    Beverage
 15:00:00   Pizza   Coke
 15:01:00   Pizza   Coke
 15:02:00   Pizza   Coke
 15:03:00   Pizza   Coke
 15:04:00   Pizza   Coke
 15:05:00   Burger  Coke
 15:06:00   Burger  Coke
 15:07:00   Burger  Coke
 15:08:00   Burger  Coke
 15:09:00   Burger  Coke
 15:10:00   Hotdog  Pepsi
 15:11:00   Hotdog  Pepsi
    …         …       …

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете использовать DATEADD .Ввод параметра N означает минуты.

ROW_NUMBER будет увеличивать временную метку на строку.

DECLARE @interval varchar(10) = 5

DROP TABLE IF EXISTS #data

SELECT timestamp='15:00:00',Food='Pizza',Beverage='Coke'
INTO #data
UNION ALL SELECT timestamp='15:05:00',Food='Burger',Beverage='Coke'
UNION ALL SELECT timestamp='15:10:00',Food='Pizza',Beverage='Pepsi'

DROP TABLE IF EXISTS #TAB 
CREATE TABLE #TAB (id int)

EXEC ('INSERT INTO #TAB
SELECT TOP '+@interval+ ' ROW_NUMBER() OVER(ORDER BY name) FROM sys.columns')

SELECT timestamp=CAST(DATEADD(n,ROW_NUMBER() OVER (PARTITION BY timestamp,food,beverage ORDER BY Food),timestamp) as time) , Food,Beverage
FROM #data
CROSS JOIN #TAB
ORDER BY 1

Выход будет:

+------------------+--------+----------+
|    timestamp     |  Food  | Beverage |
+------------------+--------+----------+
| 15:01:00.0000000 | Pizza  | Coke     |
| 15:02:00.0000000 | Pizza  | Coke     |
| 15:03:00.0000000 | Pizza  | Coke     |
| 15:04:00.0000000 | Pizza  | Coke     |
| 15:05:00.0000000 | Pizza  | Coke     |
| 15:06:00.0000000 | Burger | Coke     |
| 15:07:00.0000000 | Burger | Coke     |
| 15:08:00.0000000 | Burger | Coke     |
| 15:09:00.0000000 | Burger | Coke     |
| 15:10:00.0000000 | Burger | Coke     |
| 15:11:00.0000000 | Pizza  | Pepsi    |
| 15:12:00.0000000 | Pizza  | Pepsi    |
| 15:13:00.0000000 | Pizza  | Pepsi    |
| 15:14:00.0000000 | Pizza  | Pepsi    |
| 15:15:00.0000000 | Pizza  | Pepsi    |
+------------------+--------+----------+
0 голосов
/ 06 февраля 2019

Самый простой способ - использовать cross join:

select dateadd(minute, v.m, timestamp) as timestamp,
       food, beverage
from t cross join
     (values (0), (1), (2), (3), (4)) v(m);

Вы также можете сделать это с явным select / union all:

select dateadd(minute, v.m, timestamp) as timestamp,
       food, beverage
from t cross join
     (select 0 as m union all select 1 union all select 2 union all select 3 union all select 4
     ) v(m);
...