Неоднозначное имя столбца SQL

Я получаю следующую ошибку, когда хочу выполнить запрос SQL:
"Сообщение 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

Вот так выглядит мой стол:

CREATE TABLE [dbo].[items] (
[id]         INT           IDENTITY (1, 1) NOT NULL,
[i_id]       VARCHAR (100) NOT NULL,
[last_seen]  DATETIME2 (0) NOT NULL,
[location]   VARCHAR (200) NOT NULL,
[code_hex]   VARCHAR (100) NOT NULL,
[technology] VARCHAR (100) NOT NULL,
[url]        VARCHAR (100) NOT NULL,
[spot]       VARCHAR (200) NOT NULL,
PRIMARY KEY CLUSTERED ([id] ASC));

Я пробовал пару вещей, но я не эксперт по SQL:)
Любая помощь будет оценена

РЕДАКТИРОВАТЬ:

Я получаю повторяющиеся строки при удалении строки GROUP BY, как вы можете видеть: введите описание изображения здесь

2 ответа

Решение

Я добавляю еще один ответ, чтобы показать, как вы обычно выбираете последнюю запись на группу без дублирования. Вы используете ROW_NUMBER для этого помечаем каждую последнюю запись в i_id строкой № 1.

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;

(Вы бы использовали RANK или же DENSE_RANK вместо ROW_NUMBER если вы хотели дубликаты.)

Вы забыли псевдоним таблицы в GROUP BY i_id,

В любом случае, почему вы пишете анти-объединяющий запрос, где вы пытаетесь избавиться от дубликатов с обоими DISTINCT а также GROUP BY? Были ли у вас проблемы с прямой NOT EXISTS запрос? Вы делаете вещи намного сложнее, чем они есть на самом деле.

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, Это один; другое сравнить с MAX(last_seen); другой должен использовать ROW_NUMBER.)

Другие вопросы по тегам