Как получить новейшую запись по дате с помощью Microsoft Access - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь получить самую новую запись по дате, но сталкиваюсь с ошибкой. Это «работает», но сумма цены, которую я получаю, неверна.

Я пробовал следующее и знаю, что Last (цена) неверна.

SELECT sku, Last(price), Max(start_date)
FROM myTable
WHERE price_id="LEV001"
GROUP BY sku;

Пример данных

sku        start_date     price_id         price

ABC        1/1/2015       LEV001         124.99

ABC        11/2/2018      LEV001         121.99

ABC        3/7/2016       LEV001         112.99

ABC        12/2/2016      LEV002         134.99

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

ABC        11/2/2018       121.99

Ответы [ 3 ]

1 голос
/ 23 января 2020

Используйте order by и top, если вам нужна только одна строка:

SELECT TOP 1 t.*
FROM myTable as t
WHERE price_id = "LEV001"
ORDER BY start_date DESC;

Если вы хотите это для каждого sku - что предлагается вашим кодом - тогда используйте коррелированный подзапрос:

SELECT TOP 1 t.*
FROM myTable as t
WHERE t.price_id = "LEV001" AND
      t.start_date = (SELECT MAX(t2.start_date)
                      FROM myTable as t2
                      WHERE t2.price_id = t.price_id AND
                            t2.sky = t.sku
                     );
1 голос
/ 23 января 2020

Если вам нужна последняя запись по всей таблице, просто используйте ORDER BY и TOP 1:

SELECT TOP 1 *
FROM mytable
WHERE price_id="LEV001"
ORDER BY start_date DESC

Если вы хотите самую последнюю запись для SKU , тогда Существуют различные варианты. Одним из методов является использование анти- left join:

select t.*
from mytable t
left join mytable t1 on t1.sku = t.sku and t1.price_id = t.Price_id and t1.start_date > t.start_date
where t.price_id = 'LEV001' and t1.sku is null
order by sku
0 голосов
/ 23 января 2020

С NOT EXISTS:

SELECT t.sku, t.price, t.start_date
FROM myTable AS t
WHERE t.price_id = "LEV001"
AND NOT EXISTS (
  SELECT 1 FROM myTable
  WHERE sku = t.sku AND price_id = t.price_id AND start_date > t.start_date
)
...