我正在尝试根据表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
答案 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')