例えば表1のデータがあった場合は、
『表1』
SHOUHIN_CD SHOUHIN_KBN SID SCODE RANKING PRICE
A02071409 2 wwww xkjkljlkjas 1 1772
A02071409 2 xxxx bbbbddd 1 1772
A02071409 1 wwww kljkj;lkjada 1 1772
『表2』のようにしたいです。価格が同じであれば、SHOUHIN_KBNが小さい順、かつ商品区分が同じ場合は、同ランキングにならないよう、HEX(SID)などしてどちらか一方を拾いたい
『表2』
SHOUHIN_CD SHOUHIN_KBN SID SCODE RANKING PRICE
A02071409 2 wwww xkjkljlkjas 2 1772
A02071409 2 xxxx bbbbddd 3 1772
A02071409 1 wwww kljkj;lkjada 1 1772
表1は、以下のSQLで抽出しました
SELECT
rr1.SHOUHIN_CD
,rr1.SHOUHIN_KBN
,rr1.STORE_ID
,rr1.CODE
,(SELECT COUNT(rr2.price) + 1 AS COUNT FROM SHOUHIN rr2
WHERE rr2.SHOUHIN_CD = rr1.SHOUHIN_CD
AND rr2.price < rr1.price
AND rr2.SHOUHIN_KBN < rr1.SHOUHIN_KBN
AND HEX(rr2.STORE_ID) < HEX(rr1.STORE_ID)
) AS RANKING
,rr1.price
FROM
shouhin rr1
ORDER BY rr1.SHOUHIN_CD
,price
SQLを教えてください。どうぞよろしくお願い致します。
(ステップ1)思い通りの順番に並べるクエリ
SELECT SHOUHIN_CD, SHOUHIN_KBN, STORE_ID, PRICE FROM shouhin ORDER BY SHOUHIN_CD, PRICE, SHOUHIN_KBN, STORE_ID ;
(ステップ2)ユーザー変数を付加してランク付け
SQLその1
SET @cd = '', @rank:=0;
SQLその2
SELECT SHOUHIN_CD, SHOUHIN_KBN, STORE_ID, PRICE , @rank := IF( @cd <> SHOUHIN_CD, 1, @rank + 1 ) AS RANK , @cd := SHOUHIN_CD FROM shouhin ORDER BY SHOUHIN_CD, PRICE, SHOUHIN_KBN, STORE_ID ;
その1、その2の2つのクエリを連続して実行させる必要があります。
(ステップ3)一位だけ抜き出し
SQLその1
SET @cd = '', @rank:=0;
SQLその2
SELECT SHOUHIN_CD, SHOUHIN_KBN, STORE_ID, PRICE, RANK FROM ( SELECT SHOUHIN_CD, SHOUHIN_KBN, STORE_ID, PRICE , @rank := IF( @cd <> SHOUHIN_CD, 1, @rank + 1 ) AS RANK , @cd := SHOUHIN_CD FROM shouhin ORDER BY SHOUHIN_CD, PRICE, SHOUHIN_KBN, STORE_ID ) r WHERE RANK = 1 ;
その1、その2の2つのクエリを連続して実行させる必要があります。
>@変数を使わない
2013/11/12 22:02:47(3)「最も価格が安い商品のみを出したい」だけ考えてみましたが、
最初にコメントしたとおり重くても知りませんよ…。
ランク付けについてはもっともっと複雑になるので、正直考えたくもないです^^;
ありがとうございました!
2013/11/13 01:32:11そうでしたね。。やはり負荷を考えると前者ですね。
前者の方で実装してみます!