>

상위 3 개 카테고리에서 상위 3 개 항목의 단일 데이터 세트를 수신하기 위해 쿼리를 작성하려고합니다.

상위 카테고리는 카테고리별로 그룹화 된 내림차순으로 ItemScore 열의 합계로 정렬됩니다. 예를 들어 카테고리 1의 점수는 23이고 카테고리 2의 점수는 22입니다.

해당 카테고리의 각 항목은 ItemScore 내림차순으로 정렬됩니다.

원시 데이터 목록은 다음과 같습니다.

여기서는 예상 결과의 예입니다.

이것이 의미가 있기를 바랍니다!

업데이트 :

여기서 작업 한 스크립트와 일부 테스트 데이터가 있습니다;

CREATE TABLE [dbo].[Test]
(
    [CategoryID] [int] NULL,
    [CategoryName] [varchar](100) NULL,
    [ItemID] [int] NULL,
    [ItemName] [varchar](100) NULL,
    [ItemScore] [int] NULL
)
INSERT Test (CategoryID, CategoryName, ItemID, ItemName, ItemScore) 
VALUES (1, 'Category 1', 1, 'Item 1', 1),
       (1, 'Category 1', 2, 'Item 2', 2),
       (1, 'Category 1', 3, 'Item 3', 7),
       (1, 'Category 1', 4, 'Item 4', 1),
       (1, 'Category 1', 5, 'Item 5', 1),
       (2, 'Category 2', 6, 'Item 6', 1),
       (2, 'Category 2', 7, 'Item 7', 1),
       (2, 'Category 2', 8, 'Item 8', 9),
       (2, 'Category 2', 9, 'Item 9', 10),
       (2, 'Category 2', 10, 'Item 10', 2),
       (3, 'Category 3', 11, 'Item 11', 1),
       (3, 'Category 3', 12, 'Item 12', 1),
       (3, 'Category 3', 13, 'Item 13', 2), 
       (3, 'Category 3', 14, 'Item 14', 1),
       (3, 'Category 3', 15, 'Item 15', 2),
       (4, 'Category 4', 16, 'Item 16', 5),
       (4, 'Category 4', 17, 'Item 17', 6),
       (4, 'Category 4', 18, 'Item 18', 3),
       (4, 'Category 4', 19, 'Item 19', 5),
       (4, 'Category 4', 20, 'Item 20', 1),
       (5, 'Category 5', 21, 'Item 21', 2),
       (5, 'Category 5', 22, 'Item 22', 8),
       (5, 'Category 5', 23, 'Item 23', 5),
       (5, 'Category 5', 24, 'Item 24', 3),
       (5, 'Category 5', 25, 'Item 25', 4)
SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY t.CategoryID ORDER BY t.ItemScore DESC) AS RowNumber
FROM 
    Test t


  • 답변 # 1

    이것은 어떻습니까 :

    먼저 CategoryScore 를 계산  (와이즈 비즈의 합  카테고리 별)

    그런 다음 점수에 따라 카테고리 및 항목에 '등급'을 추가

    마지막으로 두 등급이 모두 3 이하인 레코드 만 반환

    쿼리에 넣으면 다음과 같이 보일 수 있습니다 :

    ItemScore
    
    

  • 답변 # 2

    쿼리를 서브 쿼리로 작성하려고 시도한 다음 RowNumber WITH summing AS ( SELECT CategoryID, CategoryName, ItemID, ItemName, ItemScore , SUM(ItemScore) OVER (PARTITION BY CategoryID) AS CategoryScore FROM Test ), rating AS ( SELECT CategoryID, CategoryName, ItemID, ItemName, ItemScore , DENSE_RANK() OVER (ORDER BY CategoryScore DESC, CategoryID) AS GrpNumber , ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY ItemScore DESC) AS RowNumber FROM summing ) SELECT CategoryID, CategoryName, ItemID, ItemName, ItemScore, RowNumber FROM rating WHERE GrpNumber <= 3 AND RowNumber <= 3 ORDER BY GrpNumber, RowNumber; 를 얻을 수 있습니다.   1

    3
    
    

    sqlfiddle

    SELECT * FROM ( SELECT *, Row_NUMBER() OVER (PARTITION BY t.CategoryID ORDER BY t.ItemScore DESC) AS RowNumber FROM Test t ) t1 where RowNumber <=3

관련 자료

  • 이전 c# - 몇 시간/일이 지 났는지 확인
  • 다음 python - csvDicReader ()가 사전 객체를 반환합니까?