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;