2017-08-16 14 views
1

これ以上何時間もつまずきました。私はここでいくつかの他の記事を見てきましたが、私のニーズに合ったものは見つけられません。可能な重複を削除しようとしているAccessデータベースを持っていて、一意のリストの最大値も取得してください。いくつかのフィールドに必要なデータがあります。SQL Distinctの最大値にアクセス

CustomerNumber EmpID SurveyResultID SurveyTotalScore SurveyQuestionCount

CustomerNumberに重複がありますが、別個の値が必要です。異なるSurveyTotalScoreを持つCustomerNumberが重複している場合、MAXスコアが必要です。

本質的に、最高のSurveyTotalScoreを持つ重複しないCustomerNumberのリストを返したいと思います。何が最善の方法ですか?

更新: ここでは、私が試した1つのクエリです。 CustomerNumberをそのまま残しておけば動作しますが、EmpIDとその他のフィールドが必要です。

SELECT CustomerNumber, Max(SurveyTotalScore) AS MaxScore, SurveyResultID 
FROM CSATDetail 
GROUP BY CustomerNumber, SurveyResultID; 

Example Data:

+----------------+----------+----------------+-------+ 
| CustomerNumber | MaxScore | SurveyResultID | EmpID | 
+----------------+----------+----------------+-------+ 
|   259 |  40 |   461500 | 83 | 
|   259 |  38 |   461501 | 83 | 
|   695 |  40 |   461502 | 59 | 
|   695 |  40 |   461504 | 59 | 
|   734 |  40 |   461503 | 96 | 
+----------------+----------+----------------+-------+ 

何私が出ているしたいことはこれです。それはmaxscoreを選択し、あなたが一歩離れているのEmpID

+----------------+----------+----------------+-------+ 
| CustomerNumber | MaxScore | SurveyResultID | EmpID | 
+----------------+----------+----------------+-------+ 
|   259 |  40 |   461500 | 83 | 
|   695 |  40 |   461502 | 59 | 
|   734 |  40 |   461503 | 96 | 
+----------------+----------+----------------+-------+ 
+0

レコードを複製する列を決定する必要があります。次に、それらの値のうちのどれを他の値の代わりに選択するかを選択する必要があります。重複排除のルールを作成する必要があります。 –

+0

重複する値を持つことのできない列は、SurveyResultIDのみです。私はDistinct CustomerNumberのリストを取得できますが、重複がある場合は最大SurveyTotalScoreも必要です。 – camaroracer016

+0

これはrankまたはrow_numberウィンドウ関数で簡単に実行できますが、access sqlには存在しません。だからあなたは別のデータベースを使用することができますか?でもmssql? –

答えて

0

ための複数の結果がある場合は、重複を持っていません。

  • 最大合計と顧客IDを含むセットを生成します(その中にsurveyIDは不要です)。 (チェックを少し微調整して)
  • その後、必要な情報を得るためにベースセットに戻します。これは、あなたが他の必要な情報を得ることを可能にする最大合計だけのものによって、データの完全なセットの結果を制限します。 (ちょうどこれが必要です!)

SELECT CD.CustomerNumber, MaxScore, min(SurveyResultID), EmpID 
FROM CSATDETAIL CD 
INNER JOIN (SELECT CustomerNumber, Max(SurveyTotalScore) AS MaxScore 
      FROM CSATDetail CI 
      GROUP BY CustomerNumber) CD2 
    on CD.CustomerNumber = CD2.customerNumber 
and CD.SurveyTotalScore = CD2.MaxScore 
GROUP BY CD.CustomerNumber, MaxScore, EmpID 

となりますので、サンプルデータに基づいて関連付けを行うことができ、分調査をしたいと考えています。グループ別と分別が必要でした。

----最後のコメントの後...これは基本的には今だと言います。

最も早いsurveyResultIDのスコアを持つ顧客ごとにemployeeIDを返します。

SELECT CD.CustomerNumber, MaxScore, minSurveyResultID, EmpID 
FROM CSATDETAIL CD 
INNER JOIN (SELECT CD3.CustomerNumber, CD2.MaxScore, Min(SurveyResultID) AS MinSurveyResultID 
      FROM CSATDETAIL CD3 
      INNER JOIN (SELECT CustomerNumber, Max(SurveyTotalScore) AS MaxScore 
         FROM CSATDetail CI 
         GROUP BY CustomerNumber) CD2 
       ON CD2.CustomerNumber = Cd3.CustomerNumber 
       and CD2.MaxScore = CD3.SurveyTotalScore 
      GROUP BY CD3.CustomerNumber, CD2.MaxScore) CD4 

    on CD.CustomerNumber = CD4.customerNumber 
and CD.SurveyTotalScore = CD4.MaxScore 
and CD.SurveyResultID = CD4.MinSurveyResultID 
+0

私はこれを使っても、まだすべての結果が得られます。 – camaroracer016

+0

コメントを読んでよりよく見直した後、内側のselectとjoinからsurveyIDを除外するように変更しただけで、あなたはそれを望んでいません。だから@ camaroracer016今はいかがですか? :Pただし、顧客が同じスコアを2回以上持っている場合、顧客あたりの最高得点を持つすべてのレコードが返されます。また、*を目的のフィールドに変更します。コード上に存在する場所や他の場所を除いて、*を使ってはいけません。 – xQbert

+0

これは、異なるスコアがある場所で重複を削除するようです。今、同じスコアを持っているときに重複を取り除くにはどうすればいいですか? – camaroracer016