#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