как я запрашиваю sql для последней рекордной даты каждого пользователя

У меня есть таблица, которая является набором записи относительно того, когда пользователь был зарегистрирован.

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..

Как я создаю запрос, который дал бы мне последнюю дату каждого пользователя?

Обновление: Я забыл, что у меня должно было быть значение, которое соглашается с последней датой.

189
задан a_horse_with_no_name 26 August 2018 в 20:18
поделиться

6 ответов

select t.username, t.date, t.value
from MyTable t
inner join (
    select username, max(date) as MaxDate
    from MyTable
    group by username
) tm on t.username = tm.username and t.date = tm.MaxDate
324
ответ дан 23 November 2019 в 05:39
поделиться
SELECT Username, date, value
 from MyTable mt
 inner join (select username, max(date) date
              from MyTable
              group by username) sub
  on sub.username = mt.username
   and sub.date = mt.date

Решили бы обновленную проблему. Это может не работать так хорошо с большими таблицами, даже при хорошей индексации.

0
ответ дан 23 November 2019 в 05:39
поделиться

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

select username, date, value
from tablename where (username, date) in (
    select username, max(date) as date
    from tablename
    group by username
)
20
ответ дан 23 November 2019 в 05:39
поделиться

Этот вопрос должен дать вам правильный результат для вашего отредактированного вопроса.

Подзапрос гарантирует, что найдены только строки с самой последней датой, а внешний GROUP BY позаботится о связях. Когда есть две записи для одной и той же даты для одного и того же пользователя, он вернет ту, у которой наивысшее значение .

SELECT t.username, t.date, MAX( t.value ) value
FROM your_table t
JOIN (
       SELECT username, MAX( date ) date
       FROM your_table
       GROUP BY username
) x ON ( x.username = t.username AND x.date = t.date )
GROUP BY t.username, t.date
2
ответ дан 23 November 2019 в 05:39
поделиться

Вы бы использовали агрегатную функцию MAX и GROUP BY

SELECT username, MAX(date), value FROM tablename GROUP BY username, value
-3
ответ дан 23 November 2019 в 05:39
поделиться

Использование оконных функций (работает в Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)

select * from (
    select
        username,
        date,
        value,
        row_number() over(partition by username order by date desc) as rn
    from
        yourtable
) t
where t.rn = 1
97
ответ дан 23 November 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: