2015-01-09 2 views
1

테이블이 있고 그 안에 4 개의 필드, ID, Price, QTY, Ratting 및 선택적 [위치]가 있습니다.테이블의 그룹 열에서 최상위 및 최하위 찾기

나는 열 [Qty,Ratting] 내가 GroupWise에의 위치를 ​​정의하고 선택적 열로 그 위치를 저장해야

에 의해 그룹화 된 모든 레코드를 가지고있다.

는 더 나은 이해를 위해 나는 테이블의 데이터와 이미지를 추가 한 :

enter image description here

을 내가 가지고 각 Rating에서 QTY을 바탕으로 내가 할 방법을 받고 있지 않다 Top3, Bottom3 and Rest of them as remaining.

을 표시하려면 그것.

아무도 나에게 그 방법을 제안 할 수 있습니까? 지금까지 내가 무엇을 시도했다입니다 :

Declare @RankTable TABLE 
(
    ID INT, 
    Price Decimal (10,2), 
    Qty INT, 
    Ratting INT 
) 
INSERT INTO @RankTable 
SELECT 1,10,15,1 
UNION ALL 
SELECT 2,11,11,1 
UNION ALL 
SELECT 3,96,10,1 
UNION ALL 
SELECT 4,96,8,1 
UNION ALL 
SELECT 5,56,7,1 
UNION ALL 
SELECT 6,74,5,1 
UNION ALL 
SELECT 7,93,4,1 
UNION ALL 
SELECT 8,98,2,1 
UNION ALL 
SELECT 9,12,1,1 

UNION ALL 
SELECT 10,32,80,2 
UNION ALL 
SELECT 11,74,68,2 
UNION ALL 
SELECT 12,58,57,2 
UNION ALL 
SELECT 13,37,43,2 
UNION ALL 
SELECT 14,79,32,2 
UNION ALL 
SELECT 15,29,28,2 
UNION ALL 
SELECT 16,46,17,2 
UNION ALL 
SELECT 17,86,13,2 

UNION ALL 
SELECT 19,75,110,3 
UNION ALL 
SELECT 20,27,108,3 
UNION ALL 
SELECT 21,38,104,3 
UNION ALL 
SELECT 22,87,100,3 
UNION ALL 
SELECT 23,47,89,3 
DECLARE @PositionGroup VARCHAR(1) 
SELECT *,ISNULL(@PositionGroup,'') AS Position FROM @RankTable 

답변

1

이 작업을 시도 할 수 있습니다 :

SELECT ID 
     ,Price 
     ,Qty 
     ,Ratting 
     ,CASE WHEN RowID >= 1 AND RowID <= 3 
      THEN 0 
     ELSE CASE WHEN RowID > Total - 3 THEN 1 ELSE 2 END END AS Position 
FROM (SELECT ID 
      ,Price 
      ,Qty 
      ,Ratting 
      ,COUNT(*) OVER(PARTITION BY Ratting) AS Total 
      ,ROW_NUMBER() OVER(PARTITION BY Ratting ORDER BY Qty DESC) AS RowID 
      ,ISNULL(@PositionGroup,'') AS Position 
     FROM @RankTable) AS T 
1

사용 Window Function. 이 시도.

;WITH cte 
    AS (SELECT *, 
       Row_number()OVER(partition BY rating ORDER BY id)   rn, 
       count(id)OVER(partition BY rating) mx 
     FROM @RankTable) 
SELECT ID, 
     Price, 
     Qty, 
     Rating, 
     mx - rn, 
     CASE WHEN rn IN (1, 2, 3) THEN 0 
      WHEN mx - rn IN(0, 1, 2) THEN 1 
     ELSE 2 
     END position 
FROM cte 
+0

잘못된 결과를 얻을 것 같다. – dario

+0

@ king.code - 예 업데이트 됨 –

0

이이를보십시오.

;WITH cte AS 
(
SELECT MAX(Row) [Max], 
     MIN(Row) [Min], 
     LU.Ratting 
FROM (
     SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY Ratting ORDER BY Qty DESC) Row 
     FROM @RankTable)LU 
     GROUP BY LU.Ratting 
     ) 

SELECT ID, 
     R.Price, 
     R.Qty, 
     cte.Ratting, 
     CASE WHEN (Row - Min) <= 2 THEN 0 WHEN (Max - Row) <= 2 THEN 1 ELSE 2 END Position 
FROM cte 
JOIN (
     SELECT Ratting, 
       ID, 
       Price, 
       Qty, 
       ROW_NUMBER() OVER(PARTITION BY Ratting ORDER BY Qty DESC) [Row] 
     FROM @RankTable 
     ) R ON R.Ratting = cte.Ratting 

결과 :

enter image description here

관련 문제