Как получить максимальную цену на основе последней даты от группы по запросу - PullRequest
1 голос
/ 11 апреля 2019

Пример записей:

|name  |price |source|lastest_update|
|name A| 20.00|att   |04/10/2019 00:00:00|
|name A| 30.00|att   |04/11/2019 02:00:00|
|name A| 50.00|sprint|04/10/2019 01:00:00|
|name A| 40.00|sprint|04/11/2019 21:00:00|

В основном, если мы используем группирование по «группе по имени», цена, которую мы получим, является первой из записей, это 20 долларов, ноя хочу получить максимальную цену на основе lastest_update (date).Таким образом, результаты будут:

|name  |att_price|sprint_price|
|name A|  30.00  |  40.00     |

Мой запрос

SELECT 
MAX(WHEN source = 'att' THEN price ELSE 0 END) as att_price,
MAX(WHEN source = 'sprint' THEN price ELSE 0 END) as sprint_price
FROM table GROUP BY name;

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Извлеките date из столбца отметки времени latest_update и примените max(), чтобы получить самую последнюю дату. Теперь вы можете просто добавить условие where для фильтрации строк, имеющих только эту максимальную дату.

select name,
MAX(case WHEN source = 'att' THEN price ELSE 0 END) as att_price,
MAX(case WHEN source = 'sprint' THEN price ELSE 0 END) as sprint_price
FROM test 
where date(latest_update) = (select max(date(latest_update)) from test)
GROUP BY name;

Демонстрация: https://www.db -fiddle.com / f / 43Uy7ocCKQRqJSaYHGcyRq / 0

Обновление:

Поскольку вам нужно сгруппировать для каждого source в соответствии с отдельным источником latest_update столбца, вы можете использовать следующий SQL:

select t1.name,
    max(
        case 
            when t1.source = 'att' then t1.price
            else 0
        end
      ) as att_price,
     max(
        case 
            when t1.source = 'sprint' then t1.price
            else 0
        end
      ) as sprint_price
from test t1
      inner join (
        select name,source,max(latest_update) as latest_update
        from test
        group by name,source) t2
      on t1.name = t2.name and t1.source = t2.source
      and t1.latest_update  = t2.latest_update
group by t1.name;

Демонстрация: https://www.db -fiddle.com / f / qwBxizWooVG7AMwqKjewP / 0

0 голосов
/ 11 апреля 2019

Полагаю, вы можете использовать простой коррелированный запрос с LIMIT:

SELECT name
     , (SELECT price FROM t AS x WHERE name = t.name AND source = 'att'    ORDER BY lastest_update DESC LIMIT 1) AS att_price
     , (SELECT price FROM t AS x WHERE name = t.name AND source = 'sprint' ORDER BY lastest_update DESC LIMIT 1) AS sprint_price
FROM t
GROUP BY name

Или, возможно, двойной GROUP BY:

SELECT t.name
     , MAX(CASE WHEN t.lastest_update = a.att_date    THEN price END) AS att_price
     , MAX(CASE WHEN t.lastest_update = a.sprint_date THEN price END) AS sprint_price
FROM t
JOIN (
    SELECT name
         , MAX(CASE WHEN source = 'att'    THEN lastest_update END) AS att_date
         , MAX(CASE WHEN source = 'sprint' THEN lastest_update END) AS sprint_date
    FROM t
    GROUP BY name
) AS a ON t.name = a.name
GROUP BY t.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...