У меня есть таблица, в которой регистрируются загрузки по IP, версии и платформе. Глядя на таблицу вручную, я вижу много дубликатов, где все 3 этих значения одинаковы. (пользователь, вероятно, просто нетерпелив) Я хотел бы использовать оператор SELECT, который отфильтровывает дубликаты и возвращает только одну из записей, если все 3 из этих значений одинаковы. Еще более продвинутый, если это возможно, у меня также есть поле даты/времени, которое использует CURRENT_TIMESTAMP. Было бы неплохо, если бы я мог включить дубликаты, если они из разных дней, но не из разных времен. Таким образом, я могу видеть, загружает ли тот же пользователь снова в другой день.
В основном я просто пытаюсь получить статистику о том, сколько уникальных людей загружают каждую версию каждый день. Структура таблицы БД проста...
ключ (AUTO_INCREMENT), дата (CURRENT_TIMESTAMP), ip, user_agent, платформа, версия
Программное обеспечение имеет версию (платформу) для Windows и Mac, и я предлагаю как текущую версию, так и несколько отдельных прошлых версий, которые были до серьезных изменений.
Это то, что вы хотите? Он возвращает первую запись на каждую дату для комбинации ip
/platform
/version
:
select t.*
from <tablename> t
where t.datetime = (select min(t2.datetime)
from <tablename> t2
where t2.ip = t.ip and
t2.platform = t.platform and
t2.version = t.version and
date(t2.datetime) = date(t.datetime)
);
ОК, извините за основной вопрос, но я не могу понять, что на самом деле использовать для t и t2. Имя таблицы — «загрузки». Я заменил все экземпляры «t» на «загрузки», но я не уверен, что делать с t2. Я попытался просто оставить его как t2, но я получаю 0 строк. SQL на самом деле не моя сильная сторона. Я использую его время от времени, но в основном я разработчик C/C++, поэтому я никогда не делаю ничего, кроме базовых вещей типа SELECT/INSERT.
Вы можете использовать версию mysql 8.0+ row_number()
select * from (select *,
row_number()over(partition by ip,platform,date(datetime) order by datetime) rn
from table_name
) a where a.rn=1
Похоже, мой хост использует 5.7. Есть ли аналогичный способ сделать это в более низких версиях?
@Dan нет, он доступен с 8 в mysql
Просто сгруппируйте по полям, которые вы хотите исключить из дублирования, например
SELECT ip, platform, version, COUNT(*) AS number_of_tries, max(download_date) AS last_download_date
FROM downloads
GROUP BY ip, platform, version, DATE(download_date)
Тогда было бы относительно легко выполнить более сложную фильтрацию по группировке результатов по дням и т. д.
Я должен проверить это, но это похоже на то, что я хочу