Как преобразовать данные в эту форму в SQL: - PullRequest
3 голосов
/ 03 августа 2020

Ввод:

Ввод

Мне нужно преобразовать данные из ввода в вывод. где мы пытаемся, если для id freq равно n, затем создаем n строк с этим идентификатором.

Вывод:

вывод

Ответы [ 3 ]

2 голосов
/ 03 августа 2020

В Presto один вариант использует sequence() и боковое соединение для генерации строк:

select t.id, x.value
from mytable t
cross join lateral unnest(sequence(1, t.freq)) as x(value)
order by t.id, x.value
1 голос
/ 03 августа 2020

Я бы сделал это с Lateral, как показал GMB. Однако на сервере SQL это можно сделать другим способом, как показано ниже в качестве примера:

with tally as 
(
  select top(select max(v) from myTable)
  ROW_NUMBER() OVER (ORDER BY t1.Object_ID) AS N
            FROM Master.sys.All_Columns t1
            CROSS JOIN Master.sys.All_Columns t2
)
select m.id, t.N
from tally t
cross join myTable m 
where t.N <= m.v
order by m.id, t.N;

демонстрация DBFiddle

1 голос
/ 03 августа 2020

Отличный вопрос - один из подходов - использовать таблицу целых чисел - если вы уверены, что никогда не будет больше (скажем) 128 повторов, вы можете создать таблицу целых чисел следующим образом:

CREATE TABLE nums(i INT PRIMARY KEY);
INSERT INTO nums VALUES (1);
INSERT INTO nums SELECT 1+i FROM nums;
INSERT INTO nums SELECT 2+i FROM nums;
INSERT INTO nums SELECT 4+i FROM nums;
INSERT INTO nums SELECT 8+i FROM nums;
INSERT INTO nums SELECT 16+i FROM nums;
INSERT INTO nums SELECT 32+i FROM nums;
INSERT INTO nums SELECT 64+i FROM nums;

Теперь вы можете использовать эту таблицу:

SELECT id, i AS value
 FROM input JOIN nums ON i BETWEEN 1 AND Freq
...