Mysql сгруппировать по двум столбцам, где условие и максимальная дата третьего столбца - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть таблица, в которой столбцы имеют user_id, item_id и last_date.Этот последний тип столбцов находится в datetime .

Мне нужно извлечь last_date путем группировки столбцов user_id & item_id с условием, где type_id похоже на foo и очень важно импортировать, мне нужно иметь все столбцы в результате, потому что в mytable есть больше столбцов.

Вот структура mytable:

user_id  item_id      last_date         type_id
129678      2     2019-02-17 11:00:09     foo
129678      1     2019-02-17 11:00:15     foo
129678      2     2019-02-17 11:00:10     bar
129678      2     2019-02-17 11:00:10     bar
129678      2     2019-02-17 11:00:11     foo
129678      2     2019-02-17 11:00:15     foo
129678      1     2019-02-17 11:00:09     foo
129678      2     2019-02-17 11:00:14     bar
129678      2     2019-02-17 11:00:08     bar
129678      2     2019-02-17 11:00:11     foo
129678      2     2019-02-17 11:00:14     bar
129678      2     2019-02-17 11:00:10     foo
12a0d8      3     2019-02-17 11:00:08     foo
12a0d8      2     2019-02-17 11:00:12     foo
12a0d8      3     2019-02-17 11:00:08     bar
12a0d8      3     2019-02-17 11:00:12     bar
12a0d8      1     2019-02-17 11:00:10     foo
12a0d8      1     2019-02-17 11:00:11     bar
12a0d8      3     2019-02-17 11:00:14     foo
12a0d8      3     2019-02-17 11:00:12     foo
18ae98      2     2019-02-17 11:00:12     foo
18ae98      3     2019-02-17 11:00:07     bar
18ae98      1     2019-02-17 11:00:13     bar
18ae98      1     2019-02-17 11:00:14     foo
18ae98      2     2019-02-17 11:00:09     foo
18ae98      2     2019-02-17 11:00:13     foo
18ae98      3     2019-02-17 11:00:08     foo
18ae98      1     2019-02-17 11:00:12     foo
18ae98      3     2019-02-17 11:00:10     foo
18ae98      1     2019-02-17 11:00:12     foo

Вот запрос, который я попытался для этой цели:

SELECT * FROM mytable
  WHERE last_date IN (
    SELECT MAX(last_date)
    FROM mytable
    WHERE type_id LIKE 'foo'
    GROUP BY user_id, item_id
  )

Желаемый результат:

user_id  item_id      last_date         type_id
129678      1     2019-02-17 11:00:15     foo
129678      2     2019-02-17 11:00:15     foo
12a0d8      1     2019-02-17 11:00:10     foo
12a0d8      2     2019-02-17 11:00:12     foo
12a0d8      3     2019-02-17 11:00:14     foo
18ae98      1     2019-02-17 11:00:14     foo
18ae98      2     2019-02-17 11:00:13     foo
18ae98      3     2019-02-17 11:00:10     foo

Но результат странный !!Например, это возвращение для user_id множественный item_id с тем же значением ...

Редактировать:

Если я используюэтот запрос выглядит хорошо, но я должен указать интервал даты.

SELECT * FROM mytable
WHERE type_id LIKE 'foo'
AND last_date > date_sub(curdate(), interval 2 day)
GROUP BY user_id, item_id

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Ниже будет один путь -

    SELECT 
from       MyTable t1 
INNER JOIN 
           ( 
                    SELECT   user_id, 
                             item_id, 
                             max(last_date) AS lastdate 
                    FROM     MyTable 
                    WHERE    type_id='foo' 
                    GROUP BY user_id, 
                             item_id) t2 
ON         t1.user_id=t2.user_id 
AND        t1.item_id=t2.item_id 
AND        t1.last_date=t2.lastdate
0 голосов
/ 18 февраля 2019

Вы можете просто сгруппировать по 2 столбцам, на которые вы фокусируетесь, и затем взять максимум (last_date).Подзапрос, который вы использовали ранее, не ограничивал бы max (last_date), так как несколько комбинаций user_id и item_id могут применяться к одной и той же дате.

Ниже приведена запись с вашими примерами данных, которая дает ожидаемый результат безнаписать дополнительный вложенный запрос.

declare @t table (
user_id nvarchar(15),
item_id int,
last_date datetime2,
type_id nvarchar(3)
);

insert into  @t (user_id, item_id, last_date, type_id)
values
('129678',      2,     '2019-02-17 11:00:09',     'foo'),
('129678',      1,     '2019-02-17 11:00:15',     'foo'),
('129678',      2,     '2019-02-17 11:00:10',     'bar'),
('129678',      2,     '2019-02-17 11:00:10',     'bar'),
('129678',      2,     '2019-02-17 11:00:11',     'foo'),
('129678',      2,     '2019-02-17 11:00:15',     'foo'),
('129678',      1,     '2019-02-17 11:00:09',     'foo'),
('129678',      2,     '2019-02-17 11:00:14',     'bar'),
('129678',      2,     '2019-02-17 11:00:08',     'bar'),
('129678',      2,     '2019-02-17 11:00:11',     'foo'),
('129678',      2,     '2019-02-17 11:00:14',     'bar'),
('129678',      2,     '2019-02-17 11:00:10',     'foo'),
('12a0d8',      3,     '2019-02-17 11:00:08',     'foo'),
('12a0d8',      2,     '2019-02-17 11:00:12',     'foo'),
('12a0d8',      3,     '2019-02-17 11:00:08',     'bar'),
('12a0d8',      3,     '2019-02-17 11:00:12',     'bar'),
('12a0d8',      1,     '2019-02-17 11:00:10',     'foo'),
('12a0d8',      1,     '2019-02-17 11:00:11',     'bar'),
('12a0d8',      3,     '2019-02-17 11:00:14',     'foo'),
('12a0d8',      3,     '2019-02-17 11:00:12',     'foo'),
('18ae98',      2,     '2019-02-17 11:00:12',     'foo'),
('18ae98',      3,     '2019-02-17 11:00:07',     'bar'),
('18ae98',      1,     '2019-02-17 11:00:13',     'bar'),
('18ae98',      1,     '2019-02-17 11:00:14',     'foo'),
('18ae98',      2,     '2019-02-17 11:00:09',     'foo'),
('18ae98',      2,     '2019-02-17 11:00:13',     'foo'),
('18ae98',      3,     '2019-02-17 11:00:08',     'foo'),
('18ae98',      1,     '2019-02-17 11:00:12',     'foo'),
('18ae98',      3,     '2019-02-17 11:00:10',     'foo'),
('18ae98',      1,     '2019-02-17 11:00:12',     'foo');

select * from (
select USER_ID, item_id, MAX(last_date) as last_date, type_id 
from @t where type_id = 'foo' group by user_id, item_id, type_id
) x
order by user_id, item_id;
0 голосов
/ 18 февраля 2019

использовать связанный подзапрос

   SELECT t1.* FROM mytable t1
   WHERE last_date = (
    SELECT MAX(last_date)
    FROM mytable t2
    WHERE t1.user_id=t2.user_id and t1.itemid=t2.itemid    
    and type_id LIKE 'foo'

  )
...