2012-11-15 2 views
1

프런트 엔드에서 페이징을 수행하고 정상적으로 작동하는 저장 프로 시저가 있습니다. 이제 해당 프로 시저를 반환하여 20 개의 네 열로 그룹화 한 다음 가장 낮은 우선 순위가 포함 된 각 그룹 내에서만 행을 반환해야합니다. 따라서 resort_id, 침실, 주방 및 체크인 (날짜)이 모두 일치하면 최소 우선 순위가있는 행만 반환됩니다. 여전히 페이징 기능을 유지해야합니다. @startIndex와 @upperbound는 페이징을 위해 프론트 엔드에서 프로 시저로 전달되는 parms입니다. 나는 RANK OVER (PARTITION BY)가 답이 될 것이라고 생각하고 있습니다. 나는 그것을 모두 정리하는 방법을 알 수 없습니다. 수정 후T-SQL (2005) RANK OVER (PARTITION BY)가 응답입니까?

SELECT I.id, 
     I.resort_id, 
     I.[bedrooms], 
     I.[kitchen], 
     I.[checkin], 
     I.[priority], 
     I.col_1, 
     I.col_2 /* ..... (more cols) */ 
FROM ( 
     SELECT ROW_NUMBER() OVER(ORDER by checkin) AS rowNumber, 
     * 
     FROM Inventory 
    ) AS I 
WHERE rowNumber >= @startIndex 
AND rowNumber < @upperBound 
ORDER BY rowNumber 

예 2 :

SELECT I.resort_id, 
     I.[bedrooms], 
     I.[kitchen], 
     I.[checkin], 
     I.[priority], 
     I.col_1, 
     I.col_2 /* ..... (more cols) */ 
FROM Inventory i 
JOIN 
( 
    SELECT ROW_NUMBER() OVER(ORDER BY h.checkin) as rowNumber, MIN(h.id) as id 
    FROM Inventory h 
    JOIN (
     SELECT resort_id, bedrooms, kitchen, checkin, id, MIN(priority) as priority 
     FROM Inventory 
     GROUP BY resort_id, bedrooms, kitchen, checkin, id 
    ) h2 on h.resort_id = h2.resort_id and 
      h.bedrooms = h2.bedrooms and 
      h.kitchen = h2.kitchen and 
      h.checkin = h2.checkin and 
      h.priority = h2.priority 
    GROUP BY h.resort_id, h.bedrooms, h.kitchen, h.checkin, h.priority 
) AS I2 
    on i.id = i2.id 
WHERE rowNumber >= @startIndex 
AND rowNumber < @upperBound 
ORDER BY rowNumber 
+0

재고가 있습니까? InventoryId? 신분증? – jTC

+0

@jTC - 예 - id는 pk이며 반환됩니다. 수정 된 코드 예제가 표시됩니다. –

답변

1

내가 그것을 이런 식으로 accompish 것이다.

SELECT I.resort_id, 
     I.[bedrooms], 
     I.[kitchen], 
     I.[checkin], 
     I.[priority], 
     I.col_1, 
     I.col_2 /* ..... (more cols) */ 
FROM Inventory i 
JOIN 
( 
    SELECT ROW_NUMBER(ORDER BY Checkin) as rowNumber, MIN(id) id 
    FROM Inventory h 
    JOIN (
     SELECT resort_id, bedrooms, kitchen, checkin id, MIN(priority) as priority 
     FROM Inventory 
     GROUP BY resort_id, bedrooms, kitchen, checkin 
    ) h2 on h.resort_id = h2.resort and 
      h.bedrooms = h2.bedrooms and 
      h.kitchen = h2.kitchen and 
      h.checkin = h2.checkin and 
      h.priority = h2.priority 
    GROUP BY h.resort_id, h.bedrooms, h.kitchen, h.checkin, h.priority 
) AS I2 
    on i.id = i2.id 
WHERE rowNumber >= @startIndex 
AND rowNumber < @upperBound 
ORDER BY rowNumber 
+0

RANK는 일관된 하한을 얻지 못할 것이고 동점이 될 것입니다 (최저 순위의 여러 레코드). 따라서 우선 순위가 가장 낮은 레코드를 찾고 싶다면 해당 정보를 집계하고 나머지 데이터를 첨부하는 것이 가장 쉽습니다. – jTC

+0

감사합니다 - 나는 당신의 예제를 약간 수정해야만했다. (나는 테스트를 거치지 않고서도 얼마나 어려운지 알았다.)하지만 실제로 작동하고있는 것 같다. 위의 예 2에서 수정 된 코드를 게시했다. . 전체 테스트를 마치면 알려 드리겠습니다. –

+0

내가 잡은 몇 가지 명백한 문제가있었습니다. 함께 테스트 데이터 세트를 만들었어야합니다. 그것이 어떻게 작동하는지 알려주십시오. – jTC

관련 문제