У меня есть таблица с тысячами записей для предметов аукциона. Некоторые предметы аукциона продаются сразу, другие переименовываются на последующем аукционе и по более низкой цене. Каждая запись позиции аукциона имеет уникальный идентификатор для ее записи в базе данных (поэтому, когда элемент повторно вводится, он получает новый идентификатор листинга), но также имеет уникальный идентификатор элемента, который не изменяется при повторном перечислении.
Кроме того, существуют категории предметов аукциона, а также конкретные бренды и типы (например, категория "мебель" имеет множество списков, из которых производитель "la-z-boy" является одним брендом, а затем "recliner" еще более конкретный тип).
Перечисленные элементы снова заносятся в базу данных с новым уникальным идентификатором и новой ценой, но уникальный идентификатор элемента остается прежним, а все остальные столбцы/атрибуты остаются неизменными. Я могу найти все предметы, у которых было изменение цены:
SELECT category, unique_item_identifier FROM auction_listings WHERE category='furniture' GROUP BY unique_item_identifier HAVING COUNT(*)>1;
Проблема с этим запросом заключается в том, что он возвращает только уникальный идентификатор, категорию и счетчик, но я не могу просмотреть изменения цены. Кроме того, если я попытаюсь получить более конкретный запрос, например
SELECT category, brand, unique_item_identifier FROM auction_listings WHERE category='furniture' GROUP BY unique_item_identifier HAVING COUNT(*)>1;
это не выполняется, потому что: "Выражение №2 списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец, который функционально не зависит от столбцов в предложении GROUP BY, это несовместимо с sql_mode = only_full_group_by"
Я хочу увидеть всех ла-г-мальчиков, у которых были изменения цен, а затем посмотреть, что это за изменения цены. Я также хотел бы иметь возможность запускать запрос, в котором показывались все ла-г-мальчики (независимо от типа), в которых были изменения цены, поэтому я также хочу иметь возможность выбирать категорию, бренд, тип WHERE brand = 'la- z-boy '(а затем показать всех ла-г-мальчиков, у которых были изменения цен, с выходом, включая разные цены).
Я ищу результаты, такие как:
unique-1 la-z-boy recliner price: $1000 entered on 1/1/2018
unique-1 la-z-boy recliner price: $800 entered on 2/1/2018
unique-2 la-z-boy recliner price: $1,200 entered on 1/1/2018
unique-2 la-z-boy recliner price: $1,050 entered on 2/1/2018
unique-2 la-z-boy recliner price: $950 entered on 3/1/2018
unique-3 la-z-boy couch price: $1,200 entered on 1/1/2018
unique-3 la-z-boy couch price: $1,000 entered on 2/1/2018
Заранее спасибо - я прочитал здесь десятки ответов, которые очень близки к этому конкретному запросу, но не смогли найти это явно и не смогли выяснить из других ответов, как это сделать.
Вы не предоставили выборочные данные, но, надеюсь, будет достаточно, чтобы продемонстрировать основную
+------+--------+----------+-------------+--------+
| id | userID | industry | companyName | salary |
+------+--------+----------+-------------+--------+
| 1 | 2 | 55 | abc company | 55 |
| 2 | 2 | 55 | xyz company | 75 |
| 3 | 2 | 56 | 123 company | 85 |
| 4 | 3 | 12 | cjf company | 25 |
| 5 | 4 | 52 | xxx company | 77 |
| 6 | 4 | 65 | yyy company | 99 |
+------+--------+----------+-------------+--------+
6 rows in set (0.00 sec)
Если в подзапросе мы идентифицируем те, у которых более 1 изменение зарплаты, мы можем присоединиться, чтобы получить детали
select userid,companyname,salary
from uex
where userid in(
select userid
from uex
group by userid having count(distinct salary) > 1
);
+--------+-------------+--------+
| userid | companyname | salary |
+--------+-------------+--------+
| 2 | abc company | 55 |
| 2 | xyz company | 75 |
| 2 | 123 company | 85 |
| 4 | xxx company | 77 |
| 4 | yyy company | 99 |
+--------+-------------+--------+
5 rows in set (0.02 sec)
Если вы хотите выбрать конкретного пользователя, укажите предложение where в подзапросе
select userid,companyname,salary
from uex
where userid in(
select userid
from uex
where userid = 2
group by userid having count(distinct salary) > 1
);
code
выберите идентификатор пользователя, название компании, зарплату из uex, где идентификатор пользователя = 2 в (выберите идентификатор пользователя из группы uex по идентификатору пользователя со счетом (отличная зарплата)> 1); code
sql_mode=only_full_group_by
находится в MySQL, а не в Postgres, поэтому я удалил этот тег. Ваш вопрос был бы намного понятнее, если бы вы предоставили образцы данных и желаемые результаты.