#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)