在按日期选择最大行时遇到问题

时间:2016-11-28 16:01:43

标签: sql sql-server

我正在尝试根据表2中的一些数据从表1中选择最大时间戳记录。我根据我对查询的限制条件获取了正确的记录,但我仍然得到重复的条目而不是最长时间戳记条目。有关查询错误的任何想法吗?

基本上,ID 901413368可以访问某些级别类型,而我正在尝试查找为该人管理的级别类型而为同一个人提供的最大日期请求。

SELECT  
MAX(timestamp) AS maxtime, Leveltype, assign_ID
FROM       
WHERE 
(leveltype IN
(SELECT leveltype FROM  dbo.idleveltypes  WHERE   (id = 901413368)))
GROUP BY timestamp, assign_ID, leveltype
HAVING   (assign_ID = '901413368')

更新:问题已由WEI_DBA的回复解决:

Remove the timestamp column from your Group By. Also put the assign_ID in     the Where Clause and remove the Having clause

2 个答案:

答案 0 :(得分:3)

以下可能是您想要的。它也应该是一种更简单的编写查询的方法:

SELECT MAX(a.timestamp) AS maxtime, a.Leveltype, a.assign_ID
FROM dbo.q_Archive a JOIN
     dbo.idleveltypes lt
     ON a.leveltype = lt.leveltype AND
        a.assign_ID = lt.id
WHERE assign_ID = 901413368
GROUP BY assign_ID, leveltype;

注意:

  • 在执行assign_ID之前过滤group by 。这样效率更高。
  • JOIN是表示两个表之间关系的更典型方式。
  • JOIN条件应该在匹配所需的所有列上;似乎有两个。
  • 我不明白为什么leveltype表会有一个名为id的列,但这是您的数据结构。
  • GROUP BY不需要timestamp
  • 确定应为901413368的id列的类型。是数字还是字符串?仅对字符串和日期常量使用单引号。

答案 1 :(得分:1)

从GROUP BY子句中删除时间戳,因为你得到了MAX(时间戳)

您不应将聚合字段添加到GROUP BY子句。

SELECT        
    MAX(timestamp) AS maxtime, 
    Leveltype, 
    assign_ID
FROM
    dbo.q_Archive
WHERE
    (leveltype IN (SELECT        leveltype
                           FROM            dbo.idleveltypes
                           WHERE        (id = 901413368)))
GROUP assign_ID, leveltype
HAVING        (assign_ID = '901413368')