#sql-server #row-number
#sql-сервер #номер строки
Вопрос:
Мне нужно выполнить запрос с помощью функции ROW_NUMBER(), чтобы перечислить все строки заказа на покупку по порядку purchaseID и дате доставки:
SELECT
PL.PURCHID,
PL.LINENUMBER,
ROW_NUMBER() OVER (PARTITION BY PL.PURCHID
ORDER BY PL.LineNumber, PL.DELIVERYDATE DESC) AS LineNumberOrdered
FROM AXDB13_R1.dbo.PURCHLINE PL
WHERE PL.DATAAREAID = 'pol';
дело в том, что производственная база данных слишком старая и не распознает эту функцию. Как я могу эмулировать это?
большое спасибо за вашу помощь!
Комментарии:
1. Пожалуйста, укажите текущий запрос.
2. Выберите PL.PURCHID, PL.LINENUMBER, ROW_NUMBER() ПОВЕРХ (РАЗДЕЛЕНИЕ ПО ПОРЯДКУ PL.PURCHID ПО ПОРЯДКУ PL.lineNumber, PL.DELIVERYDATE DESC) в качестве LineNumberOrdered из AXDB13_R1.dbo.PURCHLINE PL, где PL.DATAAREAID = ‘pol’
3. Я попытался ответить ниже, пожалуйста, попробуйте.
4. Опубликовать образец данных демонстрирует вашу проблему в удобном формате (т. Е. Не Вставляется в комментарий). Также было бы полезно узнать, какие первичные и уникальные ключи для этой таблицы.
Ответ №1:
Мы можем заменить ваш вызов на ROW_NUMBER
запрос коррелированного подсчета, который генерирует подсчеты по тому, что ранее было каждым разделом PURCHID
:
SELECT
PL.PURCHID,
PL.LINENUMBER,
(SELECT COUNT(*)
FROM AXDB13_R1.dbo.PURCHLINE PL2
WHERE PL2.PURCHID = PL.PURCHID AND
(PL2.LineNumber < PL.LineNumber OR
PL2.LineNumber = PL.LineNumber AND
PL2.DELIVERYDATE >= PL.DELIVERYDATE)) AS LineNumberOrdered
FROM AXDB13_R1.dbo.PURCHLINE PL
WHERE
PL.DATAAREAID = 'pol';
Комментарии:
1. PurchId Дата отправки подтверждена lineNumber LineNumberOrdered 28858-1 2020-11-20 00:00:00.000 3.0 2 28858-1 2020-11-20 00:00:00.000 4.0 4 28858-1 2020-11-20 00:00:00.000 4.0 4 <— Я пытался, но я повторяю 28858-1 2020-11-20 00:00:00.000 5.0 5 28858-1 2020-11-20 00:00:00.000 6.0 6 28858-1 2020-11-20 00:00:00.000 7.0 7 28858-1 2020-11-20 00:00:00.000 7.5 8 28858-1 2020-11-20 00:00:00.000 8.0 9 28858-1 2020-11-20 00:00:00.000 9.0 10 28858-1 2020-11-20 00:00:00.000 10.0 11 28858-1 2020-11-20 00:00:00.000 11.0 12
2. Это казалось бы невозможным, если предположить, что вы на самом деле сравниваете запрос в вашем вопросе выше. Та же таблица, то же предложение where, означает то же количество записей.
3. Исходный salesorder имеет две разные строки sales с одинаковым номером строки. также все даты доставки совпадают. так поступает из базы данных. Я ничего не изменил:/. также не всегда начинается с 1 (единицы)
4. Не имея передо мной ваших фактических данных, это все, что я могу сейчас сделать. Посмотрите, сможете ли вы принять мой ответ за отправную точку и заставить его работать.