#sql #sql-server #sql-server-2016 #window-functions
Вопрос:
Таблица А
Row Number ID orderType value Reference Code
1 1 A 5 2
2 1 A.1 2 4
1 2 A 6 5
2 2 A.1 2 1
Я пытаюсь получить эту таблицу результатов B
Row Number ID orderType value Reference Code
1 1 A 7 4
1 2 A 8 5
Я использую SQL Server 2016 и пытаюсь достичь результата в виде ТАБЛИЦЫ B, в которой я могу добавлять значение, а также получать максимальный ссылочный код.
Я использую Row_Number и сумму вместе, но не смог получить желаемый результат.
Мой вопрос таков
SELECT
ID,
Ordertype ,
ROW_NUMBER() over (Partition by Id order by OrderType ) as Row Number,
sum([Value]) over( partition by id) as Value,
Max(Reference Code) as Reference Code
From Table A
where row number = 1
Комментарии:
1. Я предлагаю изменить ваш ссылочный код на что-то, что правильно сортируется как текст.
Ответ №1:
Используйте функции окна: SUM()
для итога value
, MIN()
для orderType
и MAX()
для Reference_Code
:
SELECT DISTINCT ID,
MIN(orderType) OVER (PARTITION BY ID) orderType,
SUM(value) OVER (PARTITION BY ID) value,
MAX(Reference_Code) OVER (PARTITION BY ID) Reference_Code
FROM TableA
Смотрите демонстрацию.
Ответ №2:
Почему бы просто не использовать агрегацию?
select min(row_number), id, min(ordertype),
sum(value), max(referencecode)
from a
group by id;
Ответ №3:
Я пытался написать запрос для вас
SELECT
id,
(SELECT TOP 1 ot FROM test WHERE id=t.id ORDER BY ot) ot,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY id ) as row_num,
SUM(val) as Value,
MAX(ref_code) as ReferenceCode
FROM test as t
GROUP BY id;
Смотрите рабочую демонстрационную версию SQLFiddle