#sql #sql-server #window-functions
#sql #sql-сервер #окно-функции
Вопрос:
Это мой вывод.
Prod_ Order No_ | Old Item No_ | Quantity | Control Date
2001 KR2000001 20 2016-08-22
2001 KR2000001 20 2016-08-22
2001 KR2000001 20 2016-08-22
2001 KR2000001 20 2016-08-22
3001 KR3000001 25 2016-08-22
3001 KR3000001 25 2016-08-22
Это мой sql.
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY [Prod_ Order No_] ORDER BY [Prod_ Order No_] DESC) AS rn,
main.[Prod_ Order No_], items.[Old Item No_], main.[Item No_], main.Quantity, main.[Control Date] , main.[Control Rate],
main.[Ok Red], main.[Defect Desc], main.[State And Solve], main.[Location Code], main.[Description],
[Item Shipment Date], main.[Final Parti No_], main.[Produced By Users], main.[Renk]
FROM [Zenon data$Final Quality Control] AS main
JOIN [Zenon data$Item] AS items ON items.No_= main.[Item No_]
JOIN [Zenon data$Production Entry] AS pe ON pe.[Prod_ Order No] = main.[Prod_ Order No_]
) AS ax
WHERE rn > 0 AND rn < =20
Я хочу этот вывод, но я не мог.
Prod_ Order No_ | Old Item No_ | Quantity | Control Date
2001 KR2000001 20 2016-08-22
3001 KR3000001 25 2016-08-22
моя основная таблица — окончательный контроль качества. Первичный ключ => Номер заказа продукта_
Комментарии:
1. Почему это условие
WHERE rn > 0 AND rn < =20
, что происходит, когда вы используетеWHERE rn=1
<— это может привести к точному результату2. я хочу получить данные 20 строк из моей базы данных в приложение для Android. итак, я должен разбить на страницы. я мог бы это сделать. я хочу, чтобы prod_order_no был уникальным в выводе
3. вы не можете иметь разбивку на страницы для своего идентификатора и в то же время только одну строку для этого идентификатора… Уточните ваш запрос
Ответ №1:
select * from (
SELECT ax.*, ROW_NUMBER() OVER (PARTITION BY [Prod_ Order No_] ORDER BY [Prod_ Order No_] DESC) AS rnpage,
FROM
(
SELECT
ROW_NUMBER() OVER (PARTITION BY [Prod_ Order No_] ORDER BY [Prod_ Order No_] DESC) AS rn,
main.[Prod_ Order No_], items.[Old Item No_], main.[Item No_], main.Quantity, main.[Control Date] , main.[Control Rate],
main.[Ok Red], main.[Defect Desc], main.[State And Solve], main.[Location Code], main.[Description],
[Item Shipment Date], main.[Final Parti No_], main.[Produced By Users], main.[Renk]
FROM [Zenon data$Final Quality Control] AS main
JOIN [Zenon data$Item] AS items ON items.No_= main.[Item No_]
JOIN [Zenon data$Production Entry] AS pe ON pe.[Prod_ Order No] = main.[Prod_ Order No_]
) AS ax
WHERE rn=1
) ax2 where rnpage between 1 and 20
Комментарии:
1. я понял, что вы сделали.
Ответ №2:
Вы имеете в виду что-то вроде этого?
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY [Prod_ Order No_] ORDER BY [Prod_ Order No_] DESC) AS rn,
main.[Prod_ Order No_], items.[Old Item No_], main.[Item No_], main.Quantity, main.[Control Date] , main.[Control Rate],
main.[Ok Red], main.[Defect Desc], main.[State And Solve], main.[Location Code], main.[Description],
[Item Shipment Date], main.[Final Parti No_], main.[Produced By Users], main.[Renk]
FROM [Zenon data$Final Quality Control] AS main
JOIN [Zenon data$Item] AS items ON items.No_= main.[Item No_]
JOIN [Zenon data$Production Entry] AS pe ON pe.[Prod_ Order No] = main.[Prod_ Order No_]
) AS ax
WHERE rn > 0 AND rn < =20
GROUP BY 1, 2, 4
Комментарии:
1. Спасибо за помощь. но это не работает, прошу прощения за мой английский. я не могу добавить группу по.
2. Столбец ‘ax.rn’ недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
3. @Kayra Попробуйте СГРУППИРОВАТЬ ПО 1, 2, 4, 3
Ответ №3:
Для разбивки на страницы используйте смещение и выборку. Просто измените смещение и извлеките значения с вашей нумерацией страниц.
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY [Prod_ Order No_] ORDER BY [Prod_ Order No_] DESC) AS rn,
main.[Prod_ Order No_], items.[Old Item No_], main.[Item No_], main.Quantity, main.[Control Date] , main.[Control Rate],
main.[Ok Red], main.[Defect Desc], main.[State And Solve], main.[Location Code], main.[Description],
[Item Shipment Date], main.[Final Parti No_], main.[Produced By Users], main.[Renk]
FROM [Zenon data$Final Quality Control] AS main
JOIN [Zenon data$Item] AS items ON items.No_= main.[Item No_]
JOIN [Zenon data$Production Entry] AS pe ON pe.[Prod_ Order No] = main.[Prod_ Order No_]
) AS ax
ORDER BY rn
OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY
Комментарии:
1. я не могу этого сделать. потому что rn является динамическим.
2. для меня это разбивка на страницы, rn может быть 0, 20,40, 60, поэтому я не могу этого сделать. спасибо за помощь.