2017-02-14 2 views
0

У меня есть таблицы баз данных P, которая выглядит примерно так:Confused о JOIN и с подзапросом

date  wellID rate 
01/01/1988 well01 300 
01/02/1988 well01 301 
01/03/1988 well01 310 
........ 
01/04/1988 well02 500 
01/05/1988 well02 490 
01/06/1988 well02 495 
........ 
01/04/1988 well03 700 
01/05/1988 well03 750 
01/06/1988 well03 700 
........ 
01/07/1989 well04 400 
01/08/1989 well04 350 
01/09/1989 well04 340 
........ 

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

date  wellID oil 
01/01/1988 well01 300 
01/04/1988 well02 500 
01/04/1988 well03 700 
01/07/1989 well04 400 

Я пытаюсь извлечь эти данные из Access с помощью следующего SQL-запрос

SELECT p.date, p.wellID, p.oil 
FROM p 
LEFT JOIN 
(
    SELECT wellID, min(date) AS MinDate 
    FROM p 
) AS a 
ON p.wellID = a.wellID 
WHERE p.date = a.MinDate; 

но Access дает это сообщение «Вы пытаетесь выполнить запрос, который не делает включают указанное выражение «WellId» - часть агрегатной функции ». Я боюсь, что это выходит за рамки моих ограниченных знаний SQL, поэтому все помогают оценить

Спасибо!

+0

Спасибо Хуану и Барнард за ваш ответ - что сделал трюк – PetGriffin

ответ

2

добавить group by, и вы, вероятно, хотите INNER JOIN для этого случая

INNER JOIN 
(
    SELECT wellID, min(date) AS MinDate 
    FROM p 
    GROUP BY wellID 
) AS a 
0

Вы опущены группой пункта на внутреннем совокупном запросе.

Попробуйте это:

SELECT p.date, p.wellID, p.oil 
FROM p 
LEFT JOIN 
(
    SELECT wellID, min(date) AS MinDate 
    FROM p 
    GROUP BY wellID 
) AS a 
ON p.wellID = a.wellID 
WHERE p.date = a.MinDate; 
+0

Используйте 'Control-k' или добавить 4 пробела для форматирования в виде кода. –

Смежные вопросы