From: | Michael Glaesemann <grzm(at)myrealbox(dot)com> |
---|---|
To: | Sean Davis <sdavis2(at)mail(dot)nih(dot)gov> |
Cc: | Josep Sanmartí <josep(dot)sanmarti(at)openwired(dot)net>, <pgsql-sql(at)postgresql(dot)org> |
Subject: | Re: How to join several selects |
Date: | 2005-08-24 14:14:22 |
Message-ID: | 9C26B82A-ED19-459B-924F-0F91AABF7DD9@myrealbox.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
On Aug 24, 2005, at 11:03 PM, Sean Davis wrote:
> On 8/24/05 9:46 AM, "Josep Sanmartí" <josep(dot)sanmarti(at)openwired(dot)net>
> wrote:
>
>
>> Hello,
>> I have a 'big' problem:
>> I have the following table users(name, start_time, end_time), a
>> new row
>> is set whenever a user logs into a server. I want to know how many
>> users have logged in EVERYDAY between 2 different dates. The only
>> idea
>> that I have is making several select (one for each day):
>> SELECT COUNT(name) FROM users WHERE start_time between "startDate"
>> and "startDate+1"
>> SELECT COUNT(name) FROM users WHERE start_time between "startDate
>> +1"
>> and "startDate+2"
>> ...
>> I would like to know if its possible to make it in 1 sql statement or
>> just which is the best efficient way to solve it.
>> By the way, I use Postgres 7.4.
>>
>
>
> See:
>
> http://www.postgresql.org/docs/8.0/interactive/sql-select.html#SQL-
> UNION
> like:
>
> SELECT COUNT(name) FROM users WHERE start_time between "startDate"
> and "startDate+1"
> union
> SELECT COUNT(name) FROM users WHERE start_time between "startDate+1"
> and "startDate+2"
I'm guessing he wants something more like this, so he knows which
period is which:
SELECT count_1, count_2
FROM (
SELECT COUNT(name) AS count_1
FROM users
WHERE start_time BETWEEN startDate AND startDate + 1
) as period_1
CROSS JOIN (
SELECT COUNT(name) AS count_2
FROM users
WHERE start_time BETWEEN startDate + 1 AND startDate + 2
) as period_2
Though, you could do the same thing using UNION like this:
SELECT 'period_1'::text as period, COUNT(name) AS num_of_users
FROM users
WHERE start_time BETWEEN startDate AND startDate + 1
UNION
SELECT 'period_2'::text as period, COUNT(name) AS num_of_users
FROM users
WHERE start_time BETWEEN startDate + 1 AND startDate + 2
And of course, using EXPLAIN ANALYZE will help decide which is more
performant.
Michael Glaesemann
grzm myrealbox com
From | Date | Subject | |
---|---|---|---|
Next Message | Bo Lorentsen | 2005-08-24 14:29:00 | Re: Number of rows in a cursor ? |
Previous Message | Sean Davis | 2005-08-24 14:03:26 | Re: How to join several selects |