Как сравнить даты между строками с одинаковыми значениями столбцов, за исключением одного или двух столбцов?

#sql #sql-server #tsql #logic

Вопрос:

У меня есть сомнения в логике SQL-запроса, пожалуйста, помогите мне решить эту проблему.

Как выбрать строку с самой ранней датой разноски для одного номера счета в SQL Server:

Существующая таблица:

НОМЕР СЧЕТА-ФАКТУРЫ Имя Дата учета Место
2050 Динозавр 20.05.1998 Лондон
2050 Динозавр 25.04.1995 Австралия
2045 Птицы 18.03.1997 Америка
2045 Птицы 27.07.1995 Китай
2075 Лев 12.06.2012 Индия

Я хочу запросить вывод следующим образом:

НОМЕР СЧЕТА-ФАКТУРЫ Имя Дата учета Место
2050 Динозавр 25.04.1995 Австралия
2045 Птицы 27.07.1995 Китай
2075 Лев 12.06.2012 Индия

Я борюсь с логикой, чтобы сравнить даты двух дат учета и вернуть строку с наименьшим значением столбца даты учета для каждого номера счета в SQL Server.

Я пытался использовать MIN() и INNER JOIN раньше, но это не помогло в моей сложной кодовой базе, поэтому я просто показываю ее здесь.

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

Запрос должен создать таблицу, если дата счета-фактуры не существует в образцовой базе данных, а также имеет две даты учета, то она должна отображать одну строку с самой ранней датой учета (с тем же номером счета-фактуры), например :Китай

если дата счета-фактуры существует в образцовой базе данных и имеет две даты разноски, то в ней должны отображаться все строки с одинаковым номером счета-фактуры без изменений, например: Лондон, Австралия

Другие строки, имеющие единственную дату публикации ( независимо от того, существуют они или нет в образце базы данных), должны отображать свою строку. например:Индия

Существующий пример таблицы:

НОМЕР СЧЕТА-ФАКТУРЫ Имя Дата выставления счета Дата учета Место
2050 Динозавр 20.03.1999 20.05.1998 Лондон
2050 Динозавр 20.03.1999 25.04.1995 Австралия
2045 Птицы 26.06.2005 18.03.1997 Америка
2045 Птицы 26.06.2005 27.07.1995 Китай
2075 Лев 22.04.2012 12.06.2012 Индия

Я хочу запросить как один запрос, чтобы отобразить вывод, подобный этому:

НОМЕР СЧЕТА-ФАКТУРЫ Имя Дата выставления счета Дата учета Место
2050 Динозавр 20.03.1999 20.05.1998 Лондон
2050 Динозавр 20.03.1999 25.04.1995 Австралия
2045 Птицы 26.06.2005 27.07.1995 Китай
2075 Лев 22.04.2012 12.06.2012 Индия

Я не могу выполнить это как один запрос ВЫБОРА, и я также проверил конкретную дату вместо проверки в базе данных, это тоже не удалось. Пожалуйста, помогите мне в этом.

Примечание : это примерная таблица, она будет заполнена динамическими значениями с динамическими столбцами из кодовой базы, поэтому ввод строки-это мой не ожидаемый результат, получение вывода на основе логики-ожидаемый результат.

Спасибо

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

1. MySQL lt;gt; SQL Server — пожалуйста, исправьте свои теги.

2. В соответствии с руководством по вопросам, пожалуйста, покажите, что вы пробовали, и расскажите нам, что вы нашли (на этом сайте или в другом месте) и почему это не соответствует вашим потребностям.

Ответ №1:

Функции окна — это ваши друзья. Стоит того, чтобы вы потратили время на то, чтобы освоиться с ними. Также не ясно, нужно ли вам NAME в partition by

Кроме того, если вы хотите увидеть галстуки … используйте dense_rank() вместо row_number()

Более Производительный

 Select *  From (  Select *  ,RN = row_number() over (partition by InvoiceNumber,Name order by PostingDate)  From YourTable  ) A  Where RN=1  

Другой Вариант

 Select top 1 with ties *  From YourTable   Order by row_number() over (partition by InvoiceNumber,Name order by PostingDate)