不明确的列名称SQL
当我要执行SQL查询时,出现以下错误: Msg 209,16级,状态1,第9行 列名称“i_id”不明确 这是我要执行的SQL查询:不明确的列名称SQL,sql,sql-server,group-by,ambiguous,Sql,Sql Server,Group By,Ambiguous,当我要执行SQL查询时,出现以下错误: Msg 209,16级,状态1,第9行 列名称“i_id”不明确 这是我要执行的SQL查询: SELECT DISTINCT x.* FROM items x LEFT JOIN items y ON y.i_id = x.i_id AND x.last_seen < y.last_seen WHERE x.last_seen > '4-4-2017 10:54:11' AND x.spot = 'spot773' AND (x.techn
SELECT DISTINCT x.*
FROM items x LEFT JOIN items y
ON y.i_id = x.i_id
AND x.last_seen < y.last_seen
WHERE x.last_seen > '4-4-2017 10:54:11'
AND x.spot = 'spot773'
AND (x.technology = 'Bluetooth LE' OR x.technology = 'EPC Gen2')
AND y.id IS NULL
GROUP BY i_id
我已经尝试了一些方法,但我不是SQL专家:
任何帮助都将不胜感激
编辑:
当我逐行删除组时,确实会得到重复的行,如您所见:
您忘记了按i\u id分组的表别名 不管怎样,为什么要编写一个反连接查询,试图用DISTINCT和GROUP BY消除重复项?您是否对直接的“不存在”查询有问题?你让事情变得比实际情况更复杂
SELECT *
FROM items i
WHERE last_seen > '2017-04-04 10:54:11'
AND spot = 'spot773'
AND technology IN ('Bluetooth LE', 'EPC Gen2')
AND NOT EXISTS
(
SELECT *
FROM items other
WHERE i.i_id = other.i_id
AND i.last_seen < other.last_seen
);
当然,还有其他方法可以获得每个i_id最后一次看到的记录;另一个是与MAXlast_seen进行比较;另一种方法是使用行号。您忘记了“按i\u id分组”中的表别名 不管怎样,为什么要编写一个反连接查询,试图用DISTINCT和GROUP BY消除重复项?您是否对直接的“不存在”查询有问题?你让事情变得比实际情况更复杂
SELECT *
FROM items i
WHERE last_seen > '2017-04-04 10:54:11'
AND spot = 'spot773'
AND technology IN ('Bluetooth LE', 'EPC Gen2')
AND NOT EXISTS
(
SELECT *
FROM items other
WHERE i.i_id = other.i_id
AND i.last_seen < other.last_seen
);
当然,还有其他方法可以获得每个i_id最后一次看到的记录;另一个是与MAXlast_seen进行比较;另一种方法是使用行号。我添加了另一个答案,以显示您通常如何选择每组的最新记录,而不会获得重复记录。您可以使用行号来进行此操作,使用行号1标记每个i\u id的最后一条记录
SELECT *
FROM
(
SELECT
i.*,
ROW_NUMBER() over (PARTITION BY i_id ORDER BY last_seen DESC) as rn
FROM items i
WHERE last_seen > '2017-04-04 10:54:11'
AND spot = 'spot773'
AND technology IN ('Bluetooth LE', 'EPC Gen2')
) ranked
WHERE rn = 1;
如果您想要重复,您可以使用秩或密集秩而不是行数。我正在添加另一个答案,以显示您通常如何在不获得重复项的情况下选择每组的最新记录。您可以使用行号来进行此操作,使用行号1标记每个i\u id的最后一条记录
SELECT *
FROM
(
SELECT
i.*,
ROW_NUMBER() over (PARTITION BY i_id ORDER BY last_seen DESC) as rn
FROM items i
WHERE last_seen > '2017-04-04 10:54:11'
AND spot = 'spot773'
AND technology IN ('Bluetooth LE', 'EPC Gen2')
) ranked
WHERE rn = 1;
如果需要重复,可以使用秩或密集秩而不是行数。您需要按指定分组中的表。GROUP BY x.i_i您在GROUP BY GROUP BY PUT_x_或_Y_此处缺少别名。i_id-发生这种情况是因为x和Y中有i_id,而服务器不知道您要按哪个进行分组。这是因为您必须按不属于聚合的所有列进行分组。也许完全删除组?您的查询中已经有了删除重复项的DISTINCT。在同一查询中使用distinct和group by是多余的。您需要在group by中指定表。GROUP BY x.i_i您在GROUP BY GROUP BY PUT_x_或_Y_此处缺少别名。i_id-发生这种情况是因为x和Y中有i_id,而服务器不知道您要按哪个进行分组。这是因为您必须按不属于聚合的所有列进行分组。也许完全删除组?您的查询中已经有了删除重复项的DISTINCT。在同一查询中使用distinct和group by是多余的。谢谢您的评论,但我仍然得到重复的行?查看我的帖子中的图片您在图片中突出显示的行不是重复的;它们有不同的ID。所以你必须定义你所谓的复制品。然后,您可以决定只选择有问题的列i_id、最后一次看到的列、位置列。。。不带ID并使用DISTINCT。或者您决定显示其中一个ID,例如最大ID。你会选择列加上maxid,然后按除ID之外的所有列分组。谢谢你的评论,但我仍然得到重复的行?查看我的帖子中的图片您在图片中突出显示的行不是重复的;它们有不同的ID。所以你必须定义你所谓的复制品。然后,您可以决定只选择有问题的列i_id、最后一次看到的列、位置列。。。不带ID并使用DISTINCT。或者您决定显示其中一个ID,例如最大ID。您将选择列加上maxid,然后按除ID之外的所有列分组。