2017-06-02 96 views
0

我想寫一個SQL查詢,帶回與MAX ID2和MAX DATETIMESQL SELECT MAX()是返回多個記錄

在我目前的結果記錄,

有記錄具有相同nmae和special_number。它們只有ID2和Date_Time。 special_number應該是唯一的並且不重複。如果有重複的特殊號碼,選擇最大ID2和日期時間的記錄

對於重複項(其中有很多),我只需要選擇具有MAx ID2和DATE_TIME的記錄。 例如,ADDEN CROSS,我只需要帶回ID2 = 333和2017-05-05的ADDEN CROSS。

我試圖MAX,但沒有奏效

SELECT DISTINCT ID, NAME, MAX(ID2), SPECIAL_NUMBER and DATE_TIME 
FROm TABLE1 
WHERE DATE_TIME BETWEEN @START_DATE and @END_DATE 
GROUP BY ID, ID2, SPECIAL_NUMBER, DATE_TIME 

任何幫助表示讚賞。由於

我目前的結果

ID  NAME  ID2  SPECIAL_NUMBER DATE_TIME 
123  JOE SMITH 456  D123   2017-06-05 
123  JOE SMITH 455  D123   2017-06-04 
124  JIM DONE 111  E111   2017-06-02 
122  ME TOO  222  G111   2017-06-01 
146  ADDEN CROSS 333  R555   2017-05-05 
146  ADDEN CROSS 332  R555   2017-05-04 
146  ADDEN CROSS 331  R555   2017-05-02 

我的預期結果

ID  NAME  ID2  SPECIAL_NUMBER DATE_TIME 
123  JOE SMITH 456  D123   2017-06-05 
124  JIM DONE 111  E111   2017-06-02 
122  ME TOO  222  G111   2017-06-01 
146  ADDEN CROSS 333  R555   2017-05-05 

回答

1

那麼,你的結果是獨一無二的,我懷疑你要根據Ø日期以獲得最新的ID2。

在這種情況下,您可以使用ROW_NUMBER()

SELECT * 
FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY ID, NAME, SPECIAL_NUMBER, DATE_TIME ORDER BY ID2 DESC) AS RN 
      , ID 
      , NAME 
      , ID2 
      , SPECIAL_NUMBER 
      , DATE_TIME 
     FROM TABLE1 
     WHERE DATE_TIME BETWEEN @START_DATE and @END_DATE) AS T 
WHERE T.RN = 1; 
0

您得到多個記錄的原因是GROUP BY子句。

頂部考慮兩行:

ID  NAME  ID2  SPECIAL_NUMBER DATE_TIME 
123  JOE SMITH 456  D123   2017-06-05 
123  JOE SMITH 455  D123   2017-06-04 

由於IDID2SPECIAL_NUMBERDATE_TIMEGROUP BY所有列,SQL無法在這兩個記錄合併成一個,你的期望相符:

ID  NAME  ID2  SPECIAL_NUMBER DATE_TIME 
123  JOE SMITH 456  D123   2017-06-05 

ID2的值可以是455或456; SQL不可能比另一個更喜歡一個。同樣,DATE_TIME可能是2017-06-052017-06-04,而且數據庫無法決定選擇哪一個,而沒有明確的指示來選擇MAX

我試圖MAX,但沒有奏效

你是相當接近 - 刪除DISTINCT,然後從列表拖放ID2DATE_TIME

SELECT ID, NAME, MAX(ID2), SPECIAL_NUMBER, MAX(DATE_TIME) 
FROM TABLE1 
WHERE DATE_TIME BETWEEN @START_DATE and @END_DATE 
GROUP BY ID, SPECIAL_NUMBER 
+0

如果'ID2'不是具有最新的最新'DATE_TIME'的記錄,可能會給出錯誤的數據,可能是在他的數據中,但有機會。 :) –

+0

@EvaldasBuinauskas OP的聲明「我只需要選擇具有MAX'ID2'和'DATE_TIME'的記錄」意味着兩者在同一記錄上變成了'MAX'。否則,選擇將是不明確的。 – dasblinkenlight

2

您可以使用前n帶領帶如下

Select top (1) with ties * from yourtable 
    order by row_number() over(partition by name order by Id2 desc) 
+0

從來沒有想過使用'WITH TIES'而不是子查詢,這種方式更優雅! –

+0

但是,由於這樣的子查詢是更好的性能頂部1與關係包括一個多排序運算符...檢查我的答案在這個問題:https://stackoverflow.com/questions/44310873/filtering-by-rank-in- having-clause-without-subqueries/44311033#44311033 –

+0

是的,我在相對簡單的表格上比較了自己的執行計劃。子查詢似乎更加高效,更醜陋。 –