「group_quartile」というフィールドを持つテーブルがあります。これは、sql ntile() 関数を使用して、各顧客が活動スコアに基づいてどの四分位にあるかを計算します。ただし、この ntile(0 関数を使用すると、同じアクティビティ スコアを持つが異なる四分位にある顧客がいることがわかります。「グループ四分位」列を変更して、同じアクティビティ スコアを持つすべての顧客が同じ group_quartile にあるようにする必要があります。
テーブル値のビュー:
Customer_id Product Activity_Score Group_Quartile
CH002 T 2328 1
CR001 T 268 1
CN001 T 178 1
MS006 T 45 2
ST001 T 21 2
CH001 T 0 2
CX001 T 0 3
KH001 T 0 3
MH002 T 0 4
SJ003 T 0 4
CN001 S 439 1
AC002 S 177 1
SC001 S 91 2
PV001 S 69 3
TS001 S 0 4
CTE 式を使用しましたが、うまくいきませんでした。私のクエリのみが更新されます(上記の例から):
CX001 T 0 3
に変更
CX001 T 0 2
そのため、最初の繰り返しアクティビティ スコアのみがチェックされ、その行の group_quartile が 2 に更新されます。以下のすべての行も更新する必要があります。
CX001 T 0 3
KH001 T 0 3
MH002 T 0 4
SJ003 T 0 4
四分位の代わりに DENSE_RANK() を使用してレコードを分離することはできません。製品ごとの顧客を約 4 四分位に配置することがビジネス要件であるためです。私の理解から、テーブルをループする必要があります-
- 前の行と同じアクティビティ スコアと同じ製品を持ち、異なる group_quartile を持つ行を見つけます
- 選択した行の group_quartile をその前の四分位値に更新します
- 次に、更新されたテーブルを再度ループして、上記の条件を持つ行を探し、その行を同様に更新します。
- ループは、(同じ製品の) 同じアクティビティ スコアを持つすべての行が同じ group_quartile に配置されるまで続きます。
--
これは私が取り組んでいるテーブル構造です:
CREATE TABLE #custs
(
customer_id NVARCHAR(50),
PRODUCT NVARCHAR(50),
ACTIVITYSCORE INT,
GROUP_QUARTILE INT,
RANKED int,
rownum int
)
INSERT INTO #custs
-- 各行に行番号 (一意の ID) を与える列を追加する
SELECT customer_id, PRODUCT, ACTIVITYSCORE,GROUP_QUARTILE,RANKED,
Row_Number() OVER(partition by product ORDER BY activitiescore desc) N
FROM
-- 「セグメンテーション」列の値に基づいて親テーブルから派生した行
(SELECT customer_id, PRODUCT, ACTIVITYSCORE,
DENSE_RANK( ) 以上 (アクティビティスコアの説明による製品の順序による分割) ランクとして、
NTILE(4) OVER(PARTITION BY PRODUCT ORDER BY ACTIVITYSCORE DESC) AS GROUP_QUARTILE
FROM #parent_score_table WHERE (SEGMENTATION = 'Large')
) as temp
ORDER BY PRODUCT
これを部分的に達成するために使用した方法は次のとおりです。
-- クエリは、アクティビティ スコアが前の行と同じであるが、
GRoup_Quartiel 値が異なる行を見つけます。
-- この行を更新するにはクエリを使用する必要があります。
-- 次に、この新しく更新されたテーブルで、アクティビティ スコアが前の行と同じで
あるが、group_quartile 値が異なる行を見つけます。
-- 同じアクティビティ スコア
を持つすべての行が同じ四分位値
を持つように更新されるまで、上記の方法でテーブルを更新し続けますこの更新された行に一致する可能性のある新しい行を見つけるためにループすることはできません。
t1.customer_id,t1.ACTIVITYSCORE,t1.PRODUCT, t1.RANKED, t1.GROUP_QUARTILE, t2.GROUP_QUARTILEを #custs t1、#custs t2 から modified_quartile
として
選択(
t1.rownum = t2.rownum + 1
および t1.ACTIVITYSCORE = t2.ACTIVITYSCORE
and t1.PRODUCT = t2.PRODUCT
and not(t1.GROUP_QUARTILE = t2.GROUP_QUARTILE))
上記のt-sqlステートメントがどうあるべきか、誰でも手伝ってもらえますか? 乾杯!