2014-03-14 1 views
1

Мне нужно увеличивать +1 каждые 4 записи по столбцу таблицы, я пытался использовать ROW_NUM(), но мое грязное обходное решение не имеет смысла.Инкрементное значение для столбца каждый N записей в таблице

Это то, что мне нужно:

Index PeriodID 
1  1 
1  2 
1  3 
1  4 
2  5 
2  6 
2  7 
2  8 

PeriodID является первичным ключом (кластерный индекс) для таблицы «периодов», я слышал о оконных функциях LAG() и LEAD(), но не уверен, что если Я могу применить концепцию для этого сценария, следующий синтаксис моя не удалось подвох попытка:

выберите row_number() над (распоряжения periodid)/4 + 1, periodid из периодов

Результат я получаю:

Index PeriodID 
1  1 
1  2 
1  3 
2  4 
2  5 
2  6 
2  7 
3  8 

Я понимаю, почему я получаю этот результат, но я хотел бы знать, если есть встроенная функция T-SQL, который может помочь достичь того, что мне нужно.

Любые мысли, предложения приветствуются

Благодаря

+0

NTILE почти это делает, но из неровных групп он будет балансировать их, а не оставлять наименьшее возможное число в последней группе. –

ответ

2

Я не знаком со встроенными модулями для решения такого рода проблем, но вы можете сделать это с простой математике (и я уверен, что кто-то может затянуть это вверх, только первый проход):

CREATE TABLE #t (PeriodID int PRIMARY KEY, ExpectedIndex int); 
INSERT INTO #t VALUES (1, 1),(2, 1),(3, 1),(4, 1),(5, 2),(6, 2),(7, 2),(8, 2),(9, 3),(10, 3),(11, 3),(13, 3); 

SELECT ((RowNum - ((RowNum - 1) % 4))/4) + 1 AS [Index], ExpectedIndex, PeriodID 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY PeriodID) AS RowNum, ExpectedIndex, PeriodID FROM #t 
    ) AS tSub1 

DROP TABLE #t; 

EDIT: мне было интересно, вот версия LAG (опять же, без сомнения, не оптимизировано), плюс subqueried только, чтобы показать мою Работа:

SELECT 
    (RowNum - IncrementalLag)/4 AS ZeroBasedIndex 
    ,((RowNum - IncrementalLag)/4) + 1 AS [Index] 
    ,ExpectedIndex 
    ,PeriodID 
FROM 
    (
    SELECT 
     RowNum 
     ,LAG(RowNum,1,0) OVER (ORDER BY RowNum) % 4 AS IncrementalLag 
     ,ExpectedIndex 
     ,PeriodID 
    FROM (
     SELECT ROW_NUMBER() OVER (ORDER BY PeriodID) AS RowNum, ExpectedIndex, PeriodID FROM #t 
     ) AS tSub1 
    ) AS tSub2; 
+0

Моя кишка в том, что «простая математика» - это, вероятно, прекрасный ответ. Я не думаю, что вам нужен CONVERT (INT, ...). Мне нравится, что вы построите, вы ожидаете результата в ваших данных образца. –

2

Я считаю @downwitch правильно, это простая математическая задача, однако я считаю, что я стал с возможным ответом:

select (row_number() over (order by primaryKeyColumnName) -1)/N from table 

где N это количество записей, чтобы создать новый раздел

Надеюсь, этот ответ действительно и для других людей.

+2

Это в значительной степени исправленная версия вашего «грязного трюка». Добавьте +1 к вам, и он станет желаемой базой. –

+0

Это лучше простая математика. – downwitch