#sql #sql-server #tsql #pivot-table #transpose
Вопрос:
Пожалуйста, помогите мне перенести нижеприведенную таблицу, не создавая промежуточную таблицу. Попытался ПОВЕРНУТЬ, но потерпел неудачу. Любые предложения также будут полезны. Спасибо!
Существующая таблица:
время | Ценность |
---|---|
4/8/2020 5:18 | 1 |
4/8/2020 5:22 | 0 |
4/8/2020 7:22 | 1 |
4/8/2020 7:31 | 0 |
4/9/2020 1:44 | 1 |
4/9/2020 1:50 | 0 |
Желаемые результаты:
1 | 0 |
---|---|
4/8/2020 5:18 | 4/8/2020 5:22 |
4/8/2020 7:22 | 4/8/2020 7:31 |
4/9/2020 1:44 | 4/9/2020 1:50 |
Комментарии:
1. Как получилось, что PIVOT «провалился»? Я бы посоветовал вам провести еще несколько исследований и попробовать еще раз. Это определенно то, что вы хотите сделать.
2. Какие-либо предложения или ссылки для ссылки? пожалуйста, поделитесь
3. Да, я уже включил одну ссылку в свой первоначальный комментарий в качестве отправной точки.
4. СВОДНАЯ система не работает, потому что агрегатная функция MAX() или MIN() в столбцах времени возвращает только 1 строку из ожидаемого результата. Есть какие-нибудь предложения?
5. Я бы предложил попробовать ответ Гордона Линоффа ниже.
Ответ №1:
Вы можете перечислить их и агрегировать:
select max(case when value = 1 then time end) as value_1,
max(case when value = 0 then time end) as value_0
from (select t.*,
row_number() over (partition by value order by time) as seqnum
from t
) t
group by seqnum;
Комментарии:
1. Спасибо! Это тоже работает. Но не могу отметить оба ответа как решенные.
2. @MamunurRashid . . . Это было за 16 минут до другого ответа.
Ответ №2:
Попробуйте это решение в сочетании ROW_NUMBER
с функцией окна и PIVOT
:
SELECT [0], [1]
FROM
(
SELECT Value, TIME, ROW_NUMBER() OVER (PARTITION BY Value ORDER BY TIME) Rb
FROM MyTable
) AS SourceTable
PIVOT
(
MAX(TIME)
FOR Value IN ([0], [1])
) AS PivotTable