본문 바로가기
㏈ª By β┖υΕJini/MS-SQL

[TSQL]게시판의 카테고리 별로 N개의 글 보여 주기

by ㏈ª ☞ β┖υΕJini.κR 2009. 12. 24.

사용자 삽입 이미지

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','내용');

 

-- CROSS 를 이용하여 카테고리별 TOP 3개의 데이터를 가져와 보자.

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

 

-- CROSS 를 이용하여 카테고리별 TOP N개의 데이터를 가져와 보자. 

SELECT C.카테고리, A.날짜, A.내용

FROM(

        SELECT 카테고리

        FROM MyTempTable

        GROUP BY 카테고리

        ) AS C

  CROSS APPLY dbo.fn_Top(C.카테고리, 3) AS A;