Этот запрос (адаптировано из книги SQL MVP Deep Dives) должен дать вам то, что вы хотите:
SELECT
Sale_id, --optional, include is you want the Sale_id
-- if Serial is a (VAR)CHAR type use this field
Quantity = MAX(CAST(Serial AS INT)) - MIN(CAST(Serial AS INT)) + 1,
-- if Serial is INT already use this field instead
--Quantity = MAX(CAST(Serial AS INT)) - MIN(CAST(Serial AS INT)) + 1,
[Start] = MIN(Serial),
[End] = MAX(Serial)
FROM (
SELECT
Sale_id,
Serial,
RowNumber =
Serial - ROW_NUMBER() OVER (PARTITION BY Sale_id ORDER BY Serial)
FROM YourTable
) a
--WHERE Sale_id = 1 -- optional limiting WHERE clause
--WHERE Sale_id IN (1,2) -- optional limiting WHERE clause
GROUP BY Sale_id, RowNumber
ORDER BY Start;
я сделал предположение, что Serial
хранится в виде символьного типа и включает в себя приведение к INT. Если это уже числовой тип, замените строку без литой для Quantity
.
Я хочу указать столбец Sale_id
на выходе, если вы этого не хотите, просто прокомментируйте это. Если вы хотите ограничить результаты одним или несколькими конкретными Sale_id
, включите один из предложений WHERE
.
Sample SQL Fiddle
Пример вывод:
Sale_id Quantity Start End
----------- ----------- ---------- ----------
1 3 0001 0003
2 2 0004 0005
1 3 0006 0008
(3 row(s) affected)
Hi <спасибо за ваш ответ, я пытаюсь это одно, но выглядит не работает я упускаю некоторые вещи? вот мой код – Srikanth