Re: Subquery to select max(date) value

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: Subquery to select max(date) value
Дата
Msg-id 7c015580-fe20-be68-076c-ded42d8bf1f1@aklaver.com
обсуждение исходный текст
Ответ на Re: Subquery to select max(date) value  (Rich Shepard <rshepard@appl-ecosys.com>)
Ответы Re: Subquery to select max(date) value  (Andrew Gierth <andrew@tao11.riddles.org.uk>)
Список pgsql-general
On 2/13/19 7:37 AM, Rich Shepard wrote:
> On Wed, 13 Feb 2019, Adrian Klaver wrote:
> 
>> The LEFT JOIN. There are rows in people for which there no records coming
>> from the sub-select on activities, so the row is 'padded' with NULL 
>> values
>> for the missing data.
> 
> Adrian,
> 
> I assume it's the inner left join. I'll trace what's happening at each step
> and learn where to specify no nulls.

create table people(person_id integer, desc_fld varchar);
create table activities(person_id integer, next_contact date);

insert into people values (1, 'contacted'), (2, 'never contacted'), (3, 
'out of range'), (4, 'contacted');

insert into activities values (1, '01/31/19'), (3, '11/01/18'), (4, 
'02/02/19');

No activities record for person_id =2, activities data set to NULL:

SELECT  * FROM people AS p LEFT JOIN activities AS a ON p.person_id = 
a.person_id;
  person_id |    desc_fld     | person_id | next_contact
-----------+-----------------+-----------+--------------
          1 | contacted       |         1 | 2019-01-31
          2 | never contacted |      NULL | NULL
          3 | out of range    |         3 | 2018-11-01
          4 | contacted       |         4 | 2019-02-02

Close to your last posted query. person_id 2 and 3 have NULL values for
activities data as there is no record for 2 and 3 is out of the date range.:

  select
    p.person_id,
    p.desc_fld,
    a.next_contact
from
    people as p
    LEFT JOIN (
        SELECT
            DISTINCT ON (person_id)
            person_id,
            next_contact
        FROM
             activities a
        WHERE
            a.next_contact <= 'today' and a.next_contact > '2018-12-31' and
            a.next_contact is not null
    ) a USING (person_id)
;

  person_id |    desc_fld     | next_contact
-----------+-----------------+--------------
          1 | contacted       | 2019-01-31
          2 | never contacted | NULL
          3 | out of range    | NULL
          4 | contacted       | 2019-02-02
(4 rows)

What I think you want:

select
    p.person_id,
    p.desc_fld,
    a.next_contact
from
    people as p
    LEFT JOIN (
        SELECT
            DISTINCT ON (person_id)
            person_id,
            next_contact
        FROM
             activities a
        WHERE
            a.next_contact <= 'today' and a.next_contact > '2018-12-31' and
            a.next_contact is not null
    ) a USING (person_id)
WHERE next_contact is not null;

  person_id | desc_fld  | next_contact
-----------+-----------+--------------
          1 | contacted | 2019-01-31
          4 | contacted | 2019-02-02





> 
> Thanks,
> 
> Rich
> 
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com


В списке pgsql-general по дате отправления:

Предыдущее
От: Rich Shepard
Дата:
Сообщение: Re: Subquery to select max(date) value
Следующее
От: Andrew Gierth
Дата:
Сообщение: Re: Subquery to select max(date) value