Предложение SQl Server — Where использует максимальную дату в данных

#sql-server

#sql-server

Вопрос:

Я борюсь с тем, что, как я думал, будет легко.

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

Я хочу присоединиться к этой таблице, но извлекать записи только с даты последнего обновления таблицы

Большую часть времени я мог просто искать вчерашнюю дату, поскольку таблица обновляется большинство дней

 Where [reportdate] > DATEADD(DAY, -1, GETDATE())
 

Но поскольку он не всегда обновляется ежедневно, я хотел исключить эту проблему. Есть ли способ вернуть максимальную дату?

Я пытался вычислить max (date), но не могу определить группировку. Мне нужно вернуть все поля. Кажется, что приведенное ниже просто возвращает всю таблицу

 SELECT max ([ReportDate]) as reportdate
      ,[GUID]
      ,[Make]
      ,[Model]
      ,[MPxN]
      ,[PaymentMode]
      ,[Consent]
      ,[Category]
      ,[Fuel]
      ,[pkCommCompID]

  FROM table
  
group by guid
,[Make]
      ,[Model]
      ,[MPxN]
      ,[PaymentMode]
      ,[Consent]
      ,[Category]
      ,[Fuel]
      ,[pkCommCompID]
 

Я мог бы обойти это с помощью временной таблицы, в которой указана только максимальная дата отчета, а затем использовать это как левую часть соединения

 SELECT max ([ReportDate]) as reportdate

  FROM [DOMCustomers].[dbo].[DCC_Device_Comms_Compiled]
 

Но SQL запускается в Excel, поэтому временные таблицы проблематичны (я думаю).

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

1. Какая у вас версия SQL Server?

2. Сохраните максимальную дату отчета на стороне клиента, затем передайте ее обратно как параметр

Ответ №1:

Есть ли способ вернуть максимальную дату?

Вот так:

 SELECT *
FROM SomeTable
where ReportDate = (select max(ReportDate) from SomeTable)
 

Ответ №2:

Вот концептуальный пример.

Это создаст последнюю строку для каждой марки автомобиля.

SQL

 -- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, make VARCHAR(20), ReportDate DATETIME);
INSERT INTO @tbl (make, ReportDate) VALUES
('Ford', '2020-12-31'),
('Ford', '2020-10-17'),
('Tesla', '2020-10-25'),
('Tesla', '2020-12-30');
-- DDL and sample data population, end

;WITH rs AS
(
    SELECT *
        , ROW_NUMBER() OVER (PARTITION BY make ORDER BY ReportDate DESC) AS seq
    FROM @tbl
)
SELECT * FROM rs
WHERE seq = 1;
 

Ответ №3:

Похоже, что a DENSE_RANK и TOP будет работать (при ReportDate условии, что это a date ):

 SELECT TOP (1) WITH TIES
       [ReportDate]
      ,[GUID]
      ,[Make]
      ,[Model]
      ,[MPxN]
      ,[PaymentMode]
      ,[Consent]
      ,[Category]
      ,[Fuel]
      ,[pkCommCompID]
FROM YourTable
ORDER BY DENSE_RANK() OVER (ORDER BY ReportDate DESC);
 

Если ReportDate это значение даты и времени, и вам нужно все для последней даты (игнорируя время), затем замените ReportDate на CONVERT(date,ReportDate) в ORDER BY .

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

1. Разве это ORDER BY предложение не эквивалентно just ORDER BY ReportDate ?

2. Вероятно, в ретроспективе, @GMB . Я заканчивал день, когда писал ответ. 🙂