1

「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 四分位に配置することがビジネス要件であるためです。私の理解から、テーブルをループする必要があります-

  1. 前の行と同じアクティビティ スコアと同じ製品を持ち、異なる group_quartile を持つ行を見つけます
  2. 選択した行の group_quartile をその前の四分位値に更新します
  3. 次に、更新されたテーブルを再度ループして、上記の条件を持つ行を探し、その行を同様に更新します。
  4. ループは、(同じ製品の) 同じアクティビティ スコアを持つすべての行が同じ 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ステートメントがどうあるべきか、誰でも手伝ってもらえますか? 乾杯!

4

1 に答える 1

1

上に示したように、すでに基礎ができていると仮定するとGroup_Quartile、次のようなクエリを使用してテーブルを更新できます。

update a
set Group_Quartile = coalesce(topq.Group_Quartile, a.Group_Quartile)
from activityScores a
  outer apply
  (
    select top 1 Group_Quartile
    from activityScores topq
    where a.Product = topq.Product
      and a.Activity_Score = topq.Activity_Score
    order by Group_Quartile
  ) topq

demo を使用した SQL Fiddle

コメント後に編集:

作業を取得することで、すでに多くの作業を行ったと思いますGroup_Quartile

テーブルの各行に対して、上記のステートメントはouter applyステートメントを使用して別の行をそれに結合します。top 1この句により、1 行のみが元のテーブルに結合されます。

したがって、各行ごとに、もう 1 行を返します。Product余分な行はとで一致しActivity_Score、最も低い行Group_Quartile( order by Group_Quartile) になります。最後に、元の行をこの最小Group_Quartile値で更新して、各行が同じProductActivity_Scoreになり、可能な限り低い同じ値を持つようにしGroup_Quartileます。

したがって、 SJ003MH002などはすべて CH001 に一致し、CH001Group_Quartile値、つまり2で更新されます。

コードの説明が難しい!役立つかもしれないもう 1 つのことは、update ステートメントを使用せずに結合を調べることです。

select a.*
  , TopCustomer_id = topq.Customer_Id
  , NewGroup_Quartile = topq.Group_Quartile
from activityScores a
  outer apply
  (
    select top 1 *
    from activityScores topq
    where a.Product = topq.Product
      and a.Activity_Score = topq.Activity_Score
    order by Group_Quartile
  ) topq

更新なしの SQL Fiddle

于 2013-03-04T17:26:05.517 に答える