SQL SERVER – Ранг / Число строк в месяцах
У меня есть запрос, который выводит следующее:
RegDate Month countrycode партнер sk_skin AC GameWin 1/1/2011 1/1/2011 DE 0 a 274 32458.2558 1/1/2011 1/1/2011 UK 0 b 4 386,6925 1/1/2011 1/1/2011 FI 1 a 320 12875.0189 1/1/2011 1/1/2011 SK 1 b 85 5752.8503 1/1/2011 1/1/2011 FI 0 a 520 65339.3142 1/1/2011 1/1/2011 FI 1 a 295 29163.1045 1/1/2011 2/1/2011 DE 0 a 79 16028.3849 1/1/2011 3/1/2011 DE 0 b 4 525.252 1/1/2011 3/1/2011 DE 1 a 36 7718.6327 1/1/2011 3/1/2011 DE 1 b 24 5715.1279 1/1/2011 01.04.2011 FI 0 a 196 27357.4072 1/1/2011 4/1/2011 FI 1 a 146 20178.9315
Я хотел бы иметь номер строки в месяц, в этом случае 1/1/2011 будет 1, 2/1/2011 будет 2, 3/1/2011 будет 3, 4/1/2011 будет 4.
Этот запрос будет выполняться через цикл, чтобы месяц мог начаться в разных точках,
- Запрос SQL Server для ранжирования (RowNumber) и группировки
- Как назначить ранг с одним запросом на несколько столбцов?
- RANK, ROW_NUMBER на T-SQL
- SQL Grouping / Contract Value
- Максимальные и минимальные значения
Я хотел бы получить следующий результат;
RegDate Month countrycode партнер sk_skin AC GameWin Month 1/1/2011 1/1/2011 DE 0 a 274 32458.2558 1 1/1/2011 1/1/2011 UK 0 b 4 386,6925 1 1/1/2011 1/1/2011 FI 1 a 320 12875.0189 1 1/1/2011 1/1/2011 SK 1 b 85 5752.8503 1 1/1/2011 1/1/2011 FI 0 a 520 65339.3142 1 1/1/2011 1/1/2011 FI 1 a 295 29163.1045 1 1/1/2011 2/1/2011 DE 0 a 79 16028.3849 2 1/1/2011 3/1/2011 DE 0 b 4 525.252 3 1/1/2011 3/1/2011 DE 1 a 36 7718.6327 3 1/1/2011 3/1/2011 DE 1 b 24 5715.1279 3 1/1/2011 01.04.2011 FI 0 a 196 27357.4072 4 1/1/2011 4/1/2011 FI 1 a 146 20178.9315 4
Я попытался использовать следующее,
(RANK() OVER (ORDER BY DATEADD(m,DATEDIFF(m,0,date),0))-1) as rank
Формат даты – дата (нет времени) с использованием
DATEADD(m,DATEDIFF(m,0,datetime),0)
Этот ранг дает мне случайный номер Ранга (с каким-то рисунком), однако, поскольку этот запрос будет добавлен в цикл и итератирован по числу сгенерированных чисел, 1 для самого низкого месяца, 2 для второго наименьшего ect …
Надеюсь, я правильно объяснил.
- Столбец TSql Return на основе разделов и номеров
- Группировка данных на SQL Server
- T-SQL для создания столбца ID
- Генерация номера строки SQL Server
- Рейтинг по группам sql server
- Как ранжировать столбцы таблицы на основе дубликатов?
- Запрос SQL для получения последней строки
- Соответствие значений столбцов в последовательном запросе sql
Измените свой рейтинг на DENSE_RANK
на основе DATEPART
DENSE_RANK() OVER ( ORDER BY DATEPART(m, MyDate) )
когда вам нужно проложить несколько лет, просто добавьте еще одну дату
DENSE_RANK() OVER ( ORDER BY DATEPART(YYYY, MyDate), DATEPART(m, MyDate))
пример
DECLARE @table TABLE ( MyDate DATE ) INSERT INTO @table VALUES ( '02/01/2012' ) , ( '02/01/2012' ) , ( '02/01/2012' ) , ( '03/01/2012' ) , ( '03/01/2012' ) , ( '03/01/2012' ) , ( '04/01/2012' ) SELECT * ,DENSE_RANK() OVER ( ORDER BY DATEPART(m, MyDate) ) FROM @table
Результаты
Month Rank 2012-02-01 1 2012-02-01 1 2012-02-01 1 2012-03-01 2 2012-03-01 2 2012-03-01 2 2012-04-01 3
Используйте DENSE_RANK () вместо RANK (), это приведет к нужной нумерации.