Приведение самых последних значений на каждый день

#sql #sql-server

#sql #sql-сервер

Вопрос:

надеюсь, у вас все хорошо, возникли некоторые проблемы с запросом данных, вы пытаетесь использовать разные ответы на предыдущие сообщения, но не можете их решить. Я получил данные для некоторых продуктов, и записи показывают, что за один день люди могут несколько раз изменять цену или себестоимость товара, поэтому мне нужно зафиксировать последнюю запись для каждого дня / товара. Это будет примером записей базы данных: Пример таблицы

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

Я уже пробовал это, но он выводит одну и ту же дату для каждой записи:

 SELECT
Product,
Date,
Price_of_item,
Cost_of_item

FROM server 
WHERE DATE IN (SELECT MAX(DATE) FROM server GROUP BY DAY(DATE))
  

заранее благодарю вас

Комментарии:

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

2. Каков ваш ожидаемый результат. Пожалуйста, отредактируйте вопрос и покажите это. Спасибо.

Ответ №1:

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

Использование общих табличных выражений:

 WITH CTE AS (
SELECT product
  ,DAY(DATE) as day
  ,MAX(DATE) as maxdate
FROM server 
GROUP BY product,DAY(DATE)
)
SELECT
  CTE.Product,
  CTE.MaxDate as Date,
  s.Price_of_item,
  s.Cost_of_item
FROM CTE 
INNER JOIN server s 
   ON CTE.product=s.product and CTE.MaxDate=s.Date
  

Использование аналитических функций:

 SELECT DISTINCT 
       product
      ,FIRST_VALUE(DATE) OVER (PARTITION BY Product,DAY(DATE) ORDER BY Date DESC) as Date
      ,FIRST_VALUE(Price_of_item) OVER (PARTITION BY Product,DAY(DATE) ORDER BY Date DESC) as Price_of_item
      ,FIRST_VALUE(Cost_of_item) OVER (PARTITION BY Product,DAY(DATE) ORDER BY Date DESC) as Cost_of_item
FROM server 
  

Вывод из них должен быть:

 Product Date            Price of item   Cost of item
C       2/9/2020 13:20  20              5
C       5/9/2020 18:10  22              8
A       12/9/2020 18:50 31              16