2013-03-25 60 views
1

我有一个充满产品的sql server数据库,每个产品有1个样式记录和1个或多个sku记录。我能够使用dense_rank()成功地在这些表上分页查询,但是我不能在我的生活中弄清楚如何根据style_id以外的列来排序样式,并且仍然能够添加一个每种风格的增量排名。如何订购带有一对多关系和分页的sql server查询

我目前使用此查询:

SELECT * 
FROM 
(
    SELECT 
    styles.style_id 
    styles.department, 
    styles.style, 
    styles.brand, 
    styles.description, 
    skus.sku_id, 
    skus.color, 
    skus.size, 
    skus.price, 
    skus.creation_date, 
    DENSE_RANK() OVER (ORDER BY styles.style_id) AS style_rank 
    FROM skus 
    LEFT OUTER JOIN styles ON styles.style_id=skus.style_id 
    WHERE skus.color='blue' 
    AND styles.brand='acme' 
) AS t1 
WHERE 
t1.style_rank > 0 AND t1.style_rank <= 25 

上面可以让我在款式级别进行分页,但我需要能够根据价格ASC/DESC或ASC CREATION_DATE这些样式排序/ DESC。能够使用MAX(skus.price)排序样式等集合函数来控制排序会很好,但这不是必需的。

为了澄清,一种风格可能有三个skus,这三个skus中的每一个可能是不同的价格。

对于使用RDBMS的零售网站来说,这似乎是一个非常基本的需求,但我无法找到任何有关如何执行此操作的文档。

任何有关如何做到这一点的建议将不胜感激。

编辑: 我解决了这个使用两个查询(显示在我的答案下面)。

回答

0

我认为你需要添加PARTITION BY styles.style_id代替:

SELECT * 
FROM 
(
    SELECT 
    styles.style_id 
    styles.department, 
    styles.style, 
    styles.brand, 
    styles.description, 
    skus.sku_id, 
    skus.color, 
    skus.size, 
    skus.price, 
    skus.creation_date, 
    DENSE_RANK() OVER (PARTITION BY styles.style_id 
         ORDER BY skus.createion_date DESC, skus.price) AS style_rank 
    FROM skus 
    LEFT OUTER JOIN styles ON styles.style_id=skus.style_id 
    WHERE skus.color='blue' 
    AND styles.brand='acme' 
) AS t1 
WHERE 
t1.style_rank > 0 AND t1.style_rank <= 25 
+0

我相信我已经试过了,但让我再试一次。 – user1034772 2013-03-25 14:32:49

+0

@ user1034772 - 您可能需要使用'ROW_NUMBER()'而不是'DENSE_RANK()'。 – 2013-03-25 14:36:31

+0

我刚刚尝试了上面的DENSE_RANK()和ROW_NUMBER(),但它们都是在单个样式的上下文中对价格进行排序。我需要能够限制显示的样式数量,但也能够在排序之前对整个结果集进行排序。 – user1034772 2013-03-25 14:46:33

0

我想通了,用两个查询的解决方案。第一个查询是获取样式。第二个是使用第一个查询中的style_id来获取所有skus的“multi-get”查询。

首先查询:

SELECT * 
FROM 
(
    SELECT DISTINCT 
    styles.style_id 
    styles.department, 
    styles.style, 
    styles.brand, 
    styles.description, 
    MAX(skus.price) AS max_price, 
    ROW_NUMBER() OVER (ORDER BY MAX(skus.price) DESC) AS price_rank 
    FROM skus 
    LEFT OUTER JOIN styles ON styles.style_id=skus.style_id 
    WHERE skus.color='blue' 
    AND styles.brand='acme' 
    GROUP BY styles.style_id, styles.department, styles.style, styles.brand, styles.description 
) AS t1 
WHERE 
t1.price_rank > 0 AND t1.price_rank <= 25 

第二个查询:

SELECT 
    skus.style_id, 
    skus.sku_id, 
    skus.color, 
    skus.size, 
    skus.price, 
    skus.creation_date 
FROM skus 
WHERE skus.style_id ='styleid1' OR skus.style_id='styleid2' OR skus.style_id='styleid3' /* etc. */ 

现在填充样式对象与第二个查询相应的SKU。