Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不明确的列名称SQL_Sql_Sql Server_Group By_Ambiguous - Fatal编程技术网

不明确的列名称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

当我要执行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.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之外的所有列分组。