#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
предложение не эквивалентно justORDER BY ReportDate
?2. Вероятно, в ретроспективе, @GMB . Я заканчивал день, когда писал ответ. 🙂