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 に基づいてこれらのスタイルを並べ替えることができる必要があります。sort styles by MAX(skus.price) のような集計関数でソートを制御できると便利ですが、必須ではありません。

明確にするために、1 つのスタイルに 3 つの SKU があり、これら 3 つの SKU のそれぞれが異なる価格である可能性があります。

これは、RDBMS を使用するすべての小売 Web サイトにとって非常に基本的なニーズのようですが、これを行う方法に関するドキュメントは見つかりません。

これを行う方法についての提案は大歓迎です。

編集:2つのクエリを使用してこれを解決しました(以下の回答に示されています)。

4

2 に答える 2

0

2つのクエリを使用して解決策を見つけました。最初のクエリは、スタイルを取得することです。2 つ目は、最初のクエリの 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

2 番目のクエリ:

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. */

次に、2 番目のクエリから適切な 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 に答える