Как я могу выбрать строки с MAX (значение столбца), DISTINCT по другому столбцу в SQL?

Если вы выполняете световую проверку, лучше всего сделать это на клиенте. Он сохранит сетевой трафик, который поможет вашему серверу работать лучше. Если, если это осложняет проверку, которая включает в себя извлечение данных из базы данных или что-то вроде паролей, то лучше всего сделать это на сервере, где данные могут быть надежно проверены.

710
задан DineshDB 26 March 2018 в 09:58
поделиться

8 ответов

Вы так близки! Все, что необходимо сделать, выбрать И дом и его макс. время даты, затем соединить назад с topten таблица на ОБОИХ полях:

SELECT tt.*
FROM topten tt
INNER JOIN
    (SELECT home, MAX(datetime) AS MaxDateTime
    FROM topten
    GROUP BY home) groupedtt 
ON tt.home = groupedtt.home 
AND tt.datetime = groupedtt.MaxDateTime
874
ответ дан Andreas Rejbrand 26 March 2018 в 19:58
поделиться
  • 1
    Кодирование было utf8_general_ci, я пытался накрыть на стол и столбцы к utf8_bin без эффекта. – Raptor 2 June 2011 в 02:08

Попробуйте это

select * from mytable a join
(select home, max(datetime) datetime
from mytable
group by home) b
 on a.home = b.home and a.datetime = b.datetime

K

Отношений
1
ответ дан Khb 26 March 2018 в 19:58
поделиться
  • 1
    Извините за последний ответ: Да набор символов подразумевает use_unicode = Верный – Raptor 26 October 2011 в 21:27
SELECT  tt.*
FROM    TestTable tt 
INNER JOIN 
        (
        SELECT  coord, MAX(datetime) AS MaxDateTime 
        FROM    rapsa 
        GROUP BY
                krd 
        ) groupedtt
ON      tt.coord = groupedtt.coord
        AND tt.datetime = groupedtt.MaxDateTime
7
ответ дан Quassnoi 26 March 2018 в 19:58
поделиться

Это будет работать, даже если у Вас будет две или больше строки для каждого home с равным DATETIME:

SELECT id, home, datetime, player, resource
FROM   (
       SELECT (
              SELECT  id
              FROM    topten ti
              WHERE   ti.home = t1.home
              ORDER BY
                      ti.datetime DESC
              LIMIT 1
              ) lid
       FROM   (
              SELECT  DISTINCT home
              FROM    topten
              ) t1
       ) ro, topten t2
WHERE  t2.id = ro.lid
27
ответ дан Quassnoi 26 March 2018 в 19:58
поделиться

Здесь идет версия T-SQL :

-- Test data
DECLARE @TestTable TABLE (id INT, home INT, date DATETIME, 
  player VARCHAR(20), resource INT)
INSERT INTO @TestTable
SELECT 1, 10, '2009-03-04', 'john', 399 UNION
SELECT 2, 11, '2009-03-04', 'juliet', 244 UNION
SELECT 5, 12, '2009-03-04', 'borat', 555 UNION
SELECT 3, 10, '2009-03-03', 'john', 300 UNION
SELECT 4, 11, '2009-03-03', 'juliet', 200 UNION
SELECT 6, 12, '2009-03-03', 'borat', 500 UNION
SELECT 7, 13, '2008-12-24', 'borat', 600 UNION
SELECT 8, 13, '2009-01-01', 'borat', 700

-- Answer
SELECT id, home, date, player, resource 
FROM (SELECT id, home, date, player, resource, 
    RANK() OVER (PARTITION BY home ORDER BY date DESC) N
    FROM @TestTable
)M WHERE N = 1

-- and if you really want only home with max date
SELECT T.id, T.home, T.date, T.player, T.resource 
    FROM @TestTable T
INNER JOIN 
(   SELECT TI.id, TI.home, TI.date, 
        RANK() OVER (PARTITION BY TI.home ORDER BY TI.date) N
    FROM @TestTable TI
    WHERE TI.date IN (SELECT MAX(TM.date) FROM @TestTable TM)
)TJ ON TJ.N = 1 AND T.id = TJ.id

РЕДАКТИРОВАНИЕ
, К сожалению, нет никакого РАЗРЯДА () ПО функции в MySQL.
, Но это может быть эмулировано, видеть Эмулировать Аналитичный (иначе Занимающий место) Функции с MySQL .
, Таким образом, это версия MySQL :

SELECT id, home, date, player, resource 
FROM TestTable AS t1 
WHERE 
    (SELECT COUNT(*) 
            FROM TestTable AS t2 
            WHERE t2.home = t1.home AND t2.date > t1.date
    ) = 0
71
ответ дан Maksym Gontar 26 March 2018 в 19:58
поделиться

Это работает над Oracle:

with table_max as(
  select id
       , home
       , datetime
       , player
       , resource
       , max(home) over (partition by home) maxhome
    from table  
)
select id
     , home
     , datetime
     , player
     , resource
  from table_max
 where home = maxhome
8
ответ дан FerranB 26 March 2018 в 19:58
поделиться
  • 1
    Вы кодируете в PHP в серверной стороне? Поскольку var t doesn' t походят на объявление переменной PHP. – livibetter 11 October 2010 в 04:47

Я думаю, что это даст Вам желаемый результат:

SELECT   home, MAX(datetime)
FROM     my_table
GROUP BY home

, НО при необходимости в других столбцах также, просто сделайте соединение с исходной таблицей (проверка Michael La Voie ответ)

С наилучшими пожеланиями.

24
ответ дан sactiw 26 March 2018 в 19:58
поделиться
  • 1
    я получил u' r ответ. Но это не то, что я хочу. если Ваш вход является динамичным тогда, как можно поместить дополнительную наклонную черту в строку. U нужна функция, чтобы сделать это. Я использовал некоторую функцию, как я упомянул ранее, но я didn' t получил то, что я хочу. – Imrul 11 October 2010 в 08:18

Вы также можете попробовать это, и для больших таблиц производительность запросов будет выше. Это работает, когда для каждого дома не более двух записей и их даты разные. Лучший общий запрос MySQL - это запрос Майкла Ла Вуа выше.

SELECT t1.id, t1.home, t1.date, t1.player, t1.resource
FROM   t_scores_1 t1 
INNER JOIN t_scores_1 t2
   ON t1.home = t2.home
WHERE t1.date > t2.date

Или в случае Postgres или тех баз данных, которые предоставляют аналитические функции, попробуйте

SELECT t.* FROM 
(SELECT t1.id, t1.home, t1.date, t1.player, t1.resource
  , row_number() over (partition by t1.home order by t1.date desc) rw
 FROM   topten t1 
 INNER JOIN topten t2
   ON t1.home = t2.home
 WHERE t1.date > t2.date 
) t
WHERE t.rw = 1
10
ответ дан 22 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

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