SQLER.COM 기술 시삽으로 활동중이라 SQL 관련 질문이 올라 오면 답변을 달아 주곤 한다.
CROSS APPLY 를 활용해서 카테고리 별로 N개 데이터를 가져 올때 어떻게 하는지에 대한
질문이 올라와 CROSS APPLY 를 이용하여 한번 만들어 보았다.
CREATE TABLE MyTempTable (
[카테고리] VARCHAR(10),
[날짜] SMALLDATETIME,
[내용] VARCHAR(10)
);
INSERT INTO MyTempTable VALUES ('일반','2009-12-01','내용');
INSERT INTO MyTempTable VALUES ('질문','2009-12-02','내용');
INSERT INTO MyTempTable VALUES ('질문','2009-12-03','내용');
INSERT INTO MyTempTable VALUES ('질문','2009-12-04','내용');
INSERT INTO MyTempTable VALUES ('일반','2009-12-05','내용');
INSERT INTO MyTempTable VALUES ('일반','2009-12-06','내용');
INSERT INTO MyTempTable VALUES ('일반','2009-12-07','내용');
INSERT INTO MyTempTable VALUES ('질문','2009-12-08','내용');
INSERT INTO MyTempTable VALUES ('자료실','2009-12-09','내용');
INSERT INTO MyTempTable VALUES ('자료실','2009-12-10','내용');
INSERT INTO MyTempTable VALUES ('자료실','2009-12-11','내용');
SELECT C.카테고리, A.날짜, A.내용
FROM(
SELECT 카테고리
FROM MyTempTable
GROUP BY 카테고리
) AS C
CROSS APPLY(
SELECT TOP(3) 날짜, 내용
FROM MyTempTable AS O
WHERE O.카테고리 = C.카테고리
ORDER BY 날짜 DESC
) AS A;
-- 테이블 함수를 이용하여 N 개를 지정 할수 있도록 해보자.
CREATE FUNCTION dbo.fn_Top
(@카테고리 VARCHAR(10),@n AS INT)
RETURNS TABLE
AS
RETURN
SELECT TOP(@n) 날짜, 내용
FROM MyTempTable
WHERE 카테고리 = @카테고리
ORDER BY 날짜 DESC;
GO
SELECT C.카테고리, A.날짜, A.내용
FROM(
SELECT 카테고리
FROM MyTempTable
GROUP BY 카테고리
) AS C
CROSS APPLY dbo.fn_Top(C.카테고리, 3) AS A;