Re: Novice SQL question - Mailing list pgsql-novice

From Dr. Drexl Spivey
Subject Re: Novice SQL question
Date
Msg-id 1558458926.9205.8.camel@little-beak.com
Whole thread Raw
In response to Re: Novice SQL question  (James Keener <jim@jimkeener.com>)
List pgsql-novice
Thanks! I just hadn't seen that syntax before, but it makes 100% sense,
and matches the databases and tables.

-----Original Message-----
From: James Keener <jim@jimkeener.com>
To: drexl@little-beak.com
Cc: pgsql-novice@lists.postgresql.org
Subject: Re: Novice SQL question
Date: Tue, 21 May 2019 13:10:17 -0400

p is the alias for the petitions table (in the FROM clause). p.slug is
the slug field on the table p. (fwiw the same table can appear with
multiple references. in such a case, the table is treated as distinct
tables. That's not the case here, but that's why I said "on the tale p"
not "on the table petitions".)

In MySQL p.slug could be the slug table in the p database if the name
of a table is required in the syntax. If a field is required in the
syntax, it is always the table.field. PostgreSQL is the same, except
it's the p.slug is the slug table in the p schema (in the current
database).

On Tue, May 21, 2019 at 1:03 PM Dr. Drexl Spivey <drexl@little-beak.com
> wrote:
> Hello,
> 
> I don't know if this is the place for such inquiries, but I figured I
> would try. Worse case, someone could point me in the right direction.
> 
> I got an assignment to determine the results of the following query. 
> I
> can figure out most of it, but one or two questions remain.
> 
> WITH user_signatures AS (
>         SELECT
>                 petition_id,
>                 email,
>                 RANK() OVER (PARTITION BY email ORDER BY created_at)
> AS
>                 petition_rank,
>                 COUNT(*) OVER (PARTITION BY email) AS petition_count
>                 FROM signatures
> ), first_user_signatures AS (
>         SELECT *
>         FROM user_signatures
>         WHERE petition_rank = 1
> )
> SELECT
>         p.id,
>         p.slug,
>         SUM(first_user_signatures.petition_count) AS activity_points
> FROM petitions p INNER JOIN first_user_signatures
> ON first_user_signatures.petition_id = p.id
> GROUP BY p.id, p.slug
> ORDER BY activity_points DESC
> LIMIT 10;
> 
> Though I never used the "WITH" clause, I've learned it's used to
> create
> CTE (temporary tables). Most of the clauses and results are self
> explanatory, but I am unclear on the last subquery:
> 
> what exactly is the p.id, p.slug, and later the inter-join between
> the
> petitions p.
> 
> My understanding, and I guess it's possible, "p" would be a database,
> and "id, and slug" are tables within database p. But, then, my
> understanding of the FROM clause, "petitions p" doesn't jive??
> 
> My only other guess is that the "p" is just some reference to the
> "petitions" database??
> 
> 
> 



pgsql-novice by date:

Previous
From: James Keener
Date:
Subject: Re: Novice SQL question
Next
From: "Dr. Drexl Spivey"
Date:
Subject: SQL help?