Идентифицировать и выбрать строку, если запись впервые появляется в столбце на основе критериев? (SQL)

#sql #vba #ms-access #subquery #where-clause

#sql #vba #ms-access #подзапрос #where-предложение

Вопрос:

Я использую VBA и ADODB.Connection для извлечения данных из базы данных Access. Я хотел бы выбрать данные из базы данных, если запись в определенном столбце появляется впервые. Это лучше всего объясняется на примере итак, вот пример таблицы, которую я быстро создал в Excel, давайте представим, что таблица называется «DrinkTable»

Пример таблицы, созданной в Excel

Я хотел бы извлечь транзакции, которые произошли после 9/1/2020, с помощью нового имени (это был первый раз, когда это имя когда-либо покупало напиток, имя никогда не появляется в столбце имя до 9/1/2020).

Я могу написать инструкцию SQL, которая извлекает все записи после 9/1/2020, используя: "SELECT [Name], [Drink], [Cost], [Date] FROM [DrinkTable] WHERE [Date] >= #"9/1/2020#" ORDER BY [ID] DESC; но это не дает того, что я пытаюсь. Правильный вывод, который я ищу, это:

Пример вывода

Может ли кто-нибудь помочь мне уточнить мой оператор SQL, чтобы извлекать данные только в том случае, если запись в столбце [Имя] не появлялась до «9/1/2020?»

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

1. Ах, хороший улов! Извините, я сделал это быстро и пропустил его добавление — обновил сообщение сейчас

Ответ №1:

Вы можете использовать not exists для фильтрации строк, Name появившихся до даты разделения:

 SELECT [Name], [Drink], [Cost], [Date] 
FROM [DrinkTable] d 
WHERE 
    [Date] >= #"9/1/2020#" 
    AND NOT EXISTS (
        SELECT 1
        FROM [DrinkTable] d1
        WERE d1.[Date] < #"9/1/2020#" AND d1.[Name] = d.[Name]
    )
ORDER BY [ID] DESC
  

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

1. Изо всех сил пытаюсь заставить это работать с ADOBD в VBA, но буду держать вас в курсе

Ответ №2:

Попробуйте

 SELECT d1.[Name], [Drink], [Cost], [Date] FROM [DrinkTable] AS d1
LEFT JOIN  (SELECT [Name] FROM [DrinkTable] WHERE [Date] < #9/1/2020# ) as d2
ON d1.name = d2.name
WHERE ISNULL(d2.name)
  

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

1. Попробовав это, вы будете в курсе