2017-06-02 564 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

是的,我在相对简单的表格上比较了自己的执行计划。子查询似乎更加高效,更丑陋。 –