Пожалуйста, обратитесь к другому ответу о том, как вы можете сделать это, используя CROSS JOIN
- это довольно аккуратно. В качестве альтернативы мы можем использовать логику программирования, доступную в MS-SQL, для достижения желаемых результатов. Следующий подход сохраняет различные комбинации ID
и TYPE_ID
внутри курсора SQL. Затем он перебирает записи курсора, чтобы убедиться, что соответствующий объем данных сохранен во временной таблице. Наконец, SELECT
выполняется для временной таблицы, и курсор закрывается. Вот подтверждение концепции, которую я проверял на https://rextester.com/l/sql_server_online_compiler.
-- Create schema for testing
CREATE TABLE Test (
ID INT,
TYPE_ID INT,
CREATED_DT DATE
)
-- Populate data
INSERT INTO Test(ID, TYPE_ID, CREATED_DT)
VALUES
(123,485,'2019-08-31')
,(123,485,'2019-05-31')
,(123,485,'2019-02-28')
,(123,485,'2018-11-30')
,(123,485,'2018-08-31')
,(123,485,'2018-05-31')
,(123,487,'2019-05-31')
,(123,487,'2018-05-31');
-- Create TempTable for output
CREATE TABLE #OutputTable (
ID INT,
TYPE_ID INT,
CREATED_DT DATE,
ROW_NUM INT
)
-- Declare local variables
DECLARE @tempID INT, @tempType INT;
-- Create cursor to iterate ID and TYPE_ID
DECLARE mycursor CURSOR FOR (
SELECT DISTINCT ID, TYPE_ID FROM Test
);
OPEN mycursor
-- Populate cursor
FETCH NEXT FROM mycursor
INTO @tempID, @tempType;
-- Loop
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @count INT = (SELECT COUNT(*) FROM Test WHERE ID = @tempID AND TYPE_ID = @tempType);
INSERT INTO #OutputTable (ID, TYPE_ID, CREATED_DT, ROW_NUM)
SELECT ID, TYPE_ID, CREATED_DT, ROW_NUMBER() OVER(ORDER BY ID ASC)
FROM Test
WHERE ID = @tempID AND TYPE_ID = @tempType;
WHILE @count < 6
BEGIN
SET @count = @count + 1
INSERT INTO #OutputTable
VALUES (@tempID, @tempType, NULL, @count);
END
FETCH NEXT FROM mycursor
INTO @tempID, @tempType;
END
-- Close cursor
CLOSE mycursor;
-- View results
SELECT * FROM #OutputTable;
Обратите внимание, если у вас есть экземпляр, в котором уникальная комбинация ID
и TYPE_ID
сгруппирована более 6 раз, дополнительнаягруппировки будут включены в ваш конечный результат. Если вам нужно показать только 6 групп, вы можете изменить эту часть запроса на SELECT TOP 6 ...
.