SQL-запрос для получения записей, где первая связанная запись не совпадает

#sql-server

#sql-сервер

Вопрос:

У меня есть 2 таблицы, что-то вроде этого:

Арендует
идентификатор, LeaseDate

LeaseInvoices
ID, LeaseID, InvoiceDate, StartDate

Как я могу найти все случаи, когда дата аренды не совпадает с InvoiceDate счета-фактуры с первой начальной датой?

Я не могу понять, как это сделать, что-то в этомроде?

 SELECT * FROM LeaseInvoice
INNER JOIN Leases ON Leases.ID = LeaseInvoices.LeaseID
WHERE LeaseDate IS NULL
OR LeaseDate <> (
    SELECT TOP 1 InvoiceDate FROM LeaseInvoices
    ORDER BY StartDate DESC
)
  

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

1. я не совсем понимаю вашу логику, но, глядя на нее, вы должны иметь возможность получать нужные даты выставления счетов с помощью функции ROW_NUMBER ()

2. Возможно, добавление образца данных и ожидаемого результата сделало бы этот вопрос более понятным

Ответ №1:

Для этого можно использовать ROW_NUMBER() функцию, например:

 SELECT
    ID
    , LeaseDate
    , InvoiceDate
    , StartDate
FROM
    (
        SELECT
            L.ID
            , L.LeaseDate
            , I.InvoiceDate
            , I.StartDate
            , ROW_NUMBER() OVER (PARTITION BY L.ID ORDER BY I.StartDate) R
        FROM
            Leases L
            JOIN LeaseInvoices I ON L.ID = I.LeaseID
    ) Q
WHERE
    R = 1
    AND LeaseDate <> InvoiceDate