Номер строки по определенному столбцу в SQL

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть таблица, содержащая транзакции клиентов. Это выглядит так:

введите описание изображения здесь

Данные отсортированы по общей транзакции. Я хочу создать столбец, содержащий номер по городу. Например, первая строка показывает город Лондон, поэтому значения равны 1, вторая строка, поскольку она тоже из Лондона, значение также равно 1. Когда следующая строка не является Лондонской, значение равно 2. Таким образом, это выглядит следующим образом:

введите описание изображения здесь

Есть ли способ создать этот номер строки в SQL Server?

Ответ №1:

Вы можете попробовать использовать dense_rank()

 select *,dense_rank() over(order by city) as cityNumber
from tablename
order by total_transaction desc
  

Ответ №2:

Я считаю, что вопрос верен, и, согласно моему пониманию требования, вам нужен двухуровневый sub query , чтобы получить конечный результат,

Здесь я использовал, max поскольку данные сначала должны быть отсортированы по Total Transaction , а затем мы можем использовать dense_rank для предоставления row number с помощью max value and city.

 select t.city as "City"
      ,dense_rank() over (order by max_total_per_city desc,city) as "City Number"
      ,t.customer as "Customer"
      ,t.total_transaction as "Total Transaction"
from
(
select *
      ,max(total_transaction) over (partition by city) as max_total_per_city
  from tableName t
) t
order by total_transaction desc
  

Ответ №3:

Вы можете получить CityNumber s с помощью ROW_NUMBER() функции window:

 select City, row_number() over (order by max(TotalTransaction) desc) CityNumber
from tablename 
group by City
  

таким образом, вы можете присоединить приведенный выше запрос к таблице:

 select t.City, c.CityNumber, t.Customer, t.Totaltransaction
from tablename t inner join (
  select City, row_number() over (order by max(TotalTransaction) desc) CityNumber
  from tablename 
  group by City
) c on c.City = t.City  
order by t.TotalTransaction desc 
  

Или с DENSE_RANK() функцией окна:

 select t.City,
       dense_rank() over (order by (select max(TotalTransaction) from tablename where City = t.City) desc) as cityNumber,
       t.Customer,
       t.TotalTransaction
from tablename t
order by t.TotalTransaction desc
  

Смотрите демонстрацию.
Результаты:

 > City       | CityNumber | Customer | Totaltransaction
> :--------- | ---------: | :------- | ---------------:
> London     |          1 | Michael  |              250
> London     |          1 | Edward   |              180
> Paris      |          2 | Michael  |              160
> Madrid     |          3 | Luis     |              153
> London     |          1 | Serena   |              146
> Madrid     |          3 | Lionel   |              133
> Manchester |          4 | Frank    |               96