SQL Сервер что-то вроде foreach - PullRequest
0 голосов
/ 17 июня 2020

У меня есть представление с столбцами this enter image description here

Теперь мне нужны элементы TOP 2 для каждого ShipRegion. Я использовал такой запрос

SELECT Region, CustomerID, SUM(ExtendedPrice) AS Price 
FROM Invoices 
GROUP BY CustomerID, Region 
ORDER BY Region, Price DESC;

Этот запрос генерирует такие значения, как this enter image description here

Теперь мне нужно выбрать только 2 самых больших значения для каждый регион.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Используйте row_number():

select rc.*
from (select region, customerid, sum(extendedPrice) as price,
             row_number() over (partition by region order by sum(extendedprice) desc) as seqnum
      from invoices
      group by region, customerid
     ) rc
where seqnum <= 2;
0 голосов
/ 17 июня 2020

Похоже, это неправильный способ сделать это.

попробуйте что-нибудь вроде этого.

WITH cte AS 
    SELECT 
        Region
        , CustomerID
        , SUM(ExtendedPrice) AS Price 
        , ROW_NUMBER over( Region , CustomerID, SUM(ExtendedPrice) ) ORDER BY SUM(ExtendedPrice) DESC as 'row_number'
    FROM 
        Invoices 
    GROUP BY 
        CustomerID
        , Region 
    ORDER BY 
        Region
        , Cena DESC

SELECT 
    region 
FROM 
    cte
GROUP BY 
    region
    , value
HAVING 
    row_number < 2

Кроме того, SQL Server наивно поддерживает циклы FOR. https://docs.microsoft.com/en-us/sql/t-sql/queries/select-for-clause-transact-sql?view=sql-server-ver15

Это позволит вам указать предложение и выполнить итерацию по нему, как и следовало ожидать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...