1

我有一个充满产品的 sql server 数据库,每个产品都有 1 条样式记录和 1 条或更多 sku 记录。我能够使用dense_rank()成功地对这些表上的查询进行分页,但是我一生都无法弄清楚如何根据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 (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 或 creation_date ASC/DESC 对这些样式进行排序。如果能够使用诸如按 MAX(skus.price) 的排序样式之类的聚合函数来控制排序,那就太好了,但这不是必需的。

澄清一下,一种款式可能有三个 skus,这三个 skus 中的每一个都可能是不同的价格。

这似乎是任何使用 RDBMS 的零售网站的基本需求,但我找不到任何有关如何执行此操作的文档。

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

编辑:我使用两个查询解决了这个问题(如下面的答案所示)。

4

2 回答 2

0

我想出了一个使用两个查询的解决方案。第一个查询是获取样式。第二个是使用第一个查询中的 style_id 获取所有 sku 的“多获取”查询。

第一个查询:

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 填充样式对象。

于 2013-03-26T02:08:25.373 回答
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
于 2013-03-25T14:30:35.140 回答