2017-08-16 65 views
1

現在已經困擾了這麼多小時。我看過這裏的其他幾篇文章,但找不到適合我需求的文章。有一個Access數據庫,我試圖刪除可能的重複,並獲得最大值的唯一列表。我有幾個字段需要的數據:訪問SQL不同的最大值

CustomerNumber EmpID SurveyResultID SurveyTotalScore SurveyQuestionCount

CustomerNumber有重複,但我只需要不同的值。如果有一個重複的CustomerNumber與不同的SurveyTotalScore,我需要MAX分數。

本質上,我想返回具有最高SurveyTotalScore的獨特CustomerNumber的列表,並且不重複。最好的方法是什麼?

更新: 這是我試過的一個查詢。它工作,如果我只是離開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 | 
+----------------+----------+----------------+-------+ 

我想什麼都出來是這樣的。它選擇最大分數並且沒有重複,如果對於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 

,並因爲它似乎你可以根據樣本數據的關係,並且希望調查分鐘.....我們需要一個GROUP BY和分鐘。

----最後的評論...這基本上現在說。

以最早的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

剛剛修改,以便在讀取評論和仔細閱讀後,將surveyID從內部選擇和連接中排除,您不需要它。所以@ camaroracer016現在呢? :P但是,如果客戶不止一次擁有相同的分數,那麼將返回每個客戶最高分數的所有此類記錄。另外,將*更改爲所需的字段。真的不應該使用*除了存在或代碼上的其他地方。 – xQbert

+0

這看起來像刪除了有不同分數的重複 - 太棒了!現在 - 當我們有相同的分數時,如何去除重複項? – camaroracer016