У меня есть таблица, которая представляет собой набор записей о том, когда пользователь вошел в систему.
username, date, value
--------------------------
brad, 1/2/2010, 1.1
fred, 1/3/2010, 1.0
bob, 8/4/2009, 1.5
brad, 2/2/2010, 1.2
fred, 12/2/2009, 1.3
etc..
Как мне создать запрос, который даст мне самую последнюю дату для каждого пользователя?
Обновление: я забыл, что мне нужно иметь значение, которое соответствует самой последней дате.
sql
greatest-n-per-group
рыбья голова
источник
источник
Ответы:
источник
max(date)
будет возвращаться дата, которая объединит несколько записей). Чтобы избежать этой проблемы, было бы предпочтительно использовать решение @ dotjoe: stackoverflow.com/a/2411763/4406793 .Использование оконных функций (работает в Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)
источник
username
в данном случае) и даже не требует уникального поля "orderable" (например, присоединениеmax(date)
в других ответах).order by date desc, id desc)
.Я вижу, что большинство разработчиков используют встроенный запрос без учета его влияния на огромные данные.
Просто вы можете достичь этого путем:
источник
Чтобы получить всю строку, содержащую максимальную дату для пользователя:
источник
источник
Из моего опыта самый быстрый способ - это взять каждую строку, для которой в таблице нет новой строки.
Другое преимущество заключается в том, что используемый синтаксис очень прост и что значение запроса довольно легко понять (возьмите все строки так, чтобы не было более новой строки для рассматриваемого имени пользователя).
НЕ СУЩЕСТВУЕТ
ROW_NUMBER
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ
источник
SELECT username, value FROM t WHERE NOT EXISTS ( SELECT * FROM t AS witness WHERE witness.date > t.date AND witness.username = t.username );
Это должно дать вам правильный результат для вашего отредактированного вопроса.
Подзапрос гарантирует, что найдены только строки с самой поздней датой, а внешний
GROUP BY
позаботится о связях. Если для одного и того же пользователя есть две записи на одну и ту же дату, возвращается самая высокаяvalue
.источник
Вы также можете использовать аналитическую функцию ранга
источник
Решил бы обновленную проблему. Это может не очень хорошо работать на больших таблицах, даже при хорошей индексации.
источник
источник
Для Oracle сортирует набор результатов в порядке убывания и принимает первую запись, поэтому вы получите самую последнюю запись:
источник
источник
источник
Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)
Внутренний запрос вернет самую последнюю дату для текущего пользователя, Внешний запрос извлечет все данные в соответствии с внутренним результатом запроса.
источник
Я использовал этот способ, чтобы взять последнюю запись для каждого пользователя, который у меня есть на столе. Это был запрос, чтобы получить последнее местоположение для продавца в соответствии с недавним временем, обнаруженным на устройствах КПК.
источник
источник
Мой небольшой сборник
join
лучше, чем вложенныйselect
group by
не дает вам,primary key
что является предпочтительным дляjoin
partition by
вместе сfirst_value
( docs )Итак, вот запрос:
Плюсы:
where
помощью выписки по любому столбцуselect
любые столбцы из отфильтрованных строкМинусы:
источник
Я сделал несколько для моего приложения, как это:
Ниже приведен запрос:
источник
Это похоже на один из ответов выше, но, на мой взгляд, это намного проще и аккуратнее. Кроме того, показывает хорошее использование для заявления перекрестного применения. Для SQL Server 2005 и выше ...
источник
источник
Это также должно работать, чтобы получить все последние записи для пользователей.
источник
Вы бы использовали агрегатную функцию MAX и GROUP BY
источник
value
, а не тот, который связан соMAX(date)
строкой.