Tsql T-SQL(2005)排名是否高于(分区)答案?

Tsql T-SQL(2005)排名是否高于(分区)答案?,tsql,sql-server-2005,stored-procedures,ranking,Tsql,Sql Server 2005,Stored Procedures,Ranking,我有一个为前端进行分页的存储过程,它工作得很好。我现在需要修改该过程,将返回的20个列中的4列分组,然后只返回每个组中包含最低优先级的行。因此,当度假村id、卧室、厨房和入住日期都匹配时,只返回具有最小优先级的行。我仍然需要维护分页功能。@startIndex和@upperbound是从前端传递到过程中用于分页的参数。我在想,排名超过分区是答案,我只是不太明白如何把它放在一起 SELECT I.id, I.resort_id, I.[bedrooms],

我有一个为前端进行分页的存储过程,它工作得很好。我现在需要修改该过程,将返回的20个列中的4列分组,然后只返回每个组中包含最低优先级的行。因此,当度假村id、卧室、厨房和入住日期都匹配时,只返回具有最小优先级的行。我仍然需要维护分页功能。@startIndex和@upperbound是从前端传递到过程中用于分页的参数。我在想,排名超过分区是答案,我只是不太明白如何把它放在一起

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

我会这样做的

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

我会这样做的

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

库存上有pk吗?目录ID?id?@jTC-Yes-id是主键,正在返回-修改代码示例以显示。库存上是否有主键?目录ID?id?@jTC-Yes-id是主键,正在返回-修改代码示例以显示。RANK不会给您一个一致的下界,并将导致多条记录与最低级别绑定。因此,如果您只想查找基于最低优先级的记录,聚合这些信息并将其余的数据附加到其中是最简单的。谢谢-我不得不对您的示例进行一些修改,因为存在编译错误,我知道没有数据进行测试运行是多么困难,但它似乎可以工作-我在原始帖子中发布了上面示例2中修改后的代码。全面测试后我会告诉你的。我发现了几个明显的问题。应该制作一个测试数据集来使用。让我知道它是如何工作的。与业务部门一起完成测试并批准生产-标记为答案:swweeeet。很高兴我能帮忙!!排名不会给你一个一致的下界,会导致多条记录的排名最低。因此,如果您只想查找基于最低优先级的记录,聚合这些信息并将其余的数据附加到其中是最简单的。谢谢-我不得不对您的示例进行一些修改,因为存在编译错误,我知道没有数据进行测试运行是多么困难,但它似乎可以工作-我在原始帖子中发布了上面示例2中修改后的代码。全面测试后我会告诉你的。我发现了几个明显的问题。应该制作一个测试数据集来使用。让我知道它是如何工作的。与业务部门一起完成测试并批准生产-标记为答案:swweeeet。很高兴我能帮忙!!