1

フロントエンドのページングを行うストアド プロシージャがあり、正常に動作しています。ここで、返された 20 列のうち 4 列でグループ化し、各グループ内で優先順位が最も低い行のみを返すように、そのプロシージャを変更する必要があります。したがって、resort_id、寝室、キッチン、およびチェックイン (日付) がすべて一致する場合、優先度が最小の行のみが返されます。ページング機能を維持する必要があります。@startIndex と @upperbound は、ページングのためにフロントエンドからプロシージャに渡されるパラメーターです。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
4

1 に答える 1

1

私はこのようにそれを達成します。

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
于 2012-11-15T15:19:38.600 に答える