Хотелось бы что-нибудь по этому адресу? Хитрость заключается в том, чтобы использовать и злоупотреблять функцией CONVERT , чтобы ваши периоды времени правильно объединялись, а затем использовать DENSE_RANK , чтобы уменьшить ее до монотонно увеличивающейся последовательности.
WITH DUMMY_DATA AS
(
-- use a convert with a type of 112 to coerce dates to
-- YYYY-MM format and truncate days
-- Be creative, use to generate whatever bands you desire
SELECT CONVERT(char(7), '2011-06-01', 112) AS period, 'stuff' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf1' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf2' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf3' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stu4f' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf5' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf7' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf8' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf9' AS junk
UNION ALL SELECT CONVERT(char(7), '2011-05-01', 112) AS period, 'more stuf0' AS junk
)
, BANDS AS
(
-- Using our data, create bands in case you want to look
-- at groupings
SELECT
D.*
, DENSE_RANK() OVER (ORDER BY D.period ASC) AS banding
FROM
DUMMY_DATA D
)
, ROLLUPS AS
(
-- ROll up based on our banding
SELECT
B.period
, B.banding
, COUNT(1) AS row_count
FROM
BANDS B
GROUP BY
B.period
, B.banding
)
SELECT * FROM ROLLUPS R
Используя вышеизложенное, я получаю вывод как
[period] [band] [row_count]
2011-05 1 10
2011-06 2 1