SQL Over_rumber для группы по

#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, поэтому я не могу этого сделать. спасибо за помощь.