Thread: query help

query help

From
Brendon Gleeson
Date:
I have a table called "marketing_campaigns":

marketing_campaigns:
+----+--------------+------------+-------------+-------------
| id | date_started | date_ended | property_id | status
+----+--------------+------------+-------------+-------------
| 1  |  2005-01-01  | 2005-03-12 |  5          | sold
| 2  |  2006-01-11  | 2006-02-23 |  5          | jointly sold
| 3  |  2006-05-13  | NULL       |  5          | for sale
| 4  |  2006-02-01  | 2006-02-06 |  6          | sold

I am having trouble trying to say: Only show old campaigns And only if
their is not a "current" campaign for this property(property_id)

The result of the query should only return row 4. Is their a way to do this
in sql without resorting to proprietary functions, or should I resort to
using Ruby (rails app)

Re: query help

From
"Jim C. Nasby"
Date:
On Wed, Jul 26, 2006 at 01:37:05PM +0200, Brendon Gleeson wrote:
>
> I have a table called "marketing_campaigns":
>
> marketing_campaigns:
> +----+--------------+------------+-------------+-------------
> | id | date_started | date_ended | property_id | status
> +----+--------------+------------+-------------+-------------
> | 1  |  2005-01-01  | 2005-03-12 |  5          | sold
> | 2  |  2006-01-11  | 2006-02-23 |  5          | jointly sold
> | 3  |  2006-05-13  | NULL       |  5          | for sale
> | 4  |  2006-02-01  | 2006-02-06 |  6          | sold
>
> I am having trouble trying to say: Only show old campaigns And only if
> their is not a "current" campaign for this property(property_id)

#define 'old campaigns' and 'current'

> The result of the query should only return row 4. Is their a way to do this
> in sql without resorting to proprietary functions, or should I resort to
> using Ruby (rails app)

No, this can certainly be done in SQL, though if you have pseudo or ruby
code on how you'd do it, it might make it a bit more clear on what
you're after.
--
Jim C. Nasby, Sr. Engineering Consultant      jnasby@pervasive.com
Pervasive Software      http://pervasive.com    work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf       cell: 512-569-9461

Re: query help

From
Keith Worthington
Date:
Jim C. Nasby wrote:
> On Wed, Jul 26, 2006 at 01:37:05PM +0200, Brendon Gleeson wrote:
>
>>I have a table called "marketing_campaigns":
>>
>>marketing_campaigns:
>>+----+--------------+------------+-------------+-------------
>>| id | date_started | date_ended | property_id | status
>>+----+--------------+------------+-------------+-------------
>>| 1  |  2005-01-01  | 2005-03-12 |  5          | sold
>>| 2  |  2006-01-11  | 2006-02-23 |  5          | jointly sold
>>| 3  |  2006-05-13  | NULL       |  5          | for sale
>>| 4  |  2006-02-01  | 2006-02-06 |  6          | sold
>>
>>I am having trouble trying to say: Only show old campaigns And only if
>>their is not a "current" campaign for this property(property_id)
>
>
> #define 'old campaigns' and 'current'
>
>
>>The result of the query should only return row 4. Is their a way to do this
>>in sql without resorting to proprietary functions, or should I resort to
>>using Ruby (rails app)
>
>
> No, this can certainly be done in SQL, though if you have pseudo or ruby
> code on how you'd do it, it might make it a bit more clear on what
> you're after.

I can't test this at the moment but how about something like this.

SELECT *
   FROM marketing_campaigns
  WHERE date_ended IS NOT NULL
    AND property_id NOT IN ( SELECT property_id
                               FROM marketing_campaigns
                              WHERE date_ended IS NULL
                            )
  ORDER BY id;

--

Kind Regards,
Keith

Re: query help

From
Brendon Gleeson
Date:
Jim C. Nasby wrote:
...
> No, this can certainly be done in SQL, though if you have pseudo or ruby
> code on how you'd do it, it might make it a bit more clear on what
> you're after.
...
I managed to find a suitable solution for this:
(I am using postgres 7.4)

SELECT property_id, address FROM marketing_campaigns
LEFT JOIN properties ON properties.id = marketing_campaigns.property_id
WHERE address LIKE *?
GROUP BY property_id, address
HAVING count(ended_on) = **count(1)

* variable
** apparently count(1) is faster  than count(*) and count(id), my Rails log
confirms this, however I have a limited amount of records at the moment so
benchmarks are properly inaccurate..

Re: query help

From
Tom Lane
Date:
Brendon Gleeson <brendon@gleesonprop.co.za> writes:
> ** apparently count(1) is faster  than count(*) and count(id), my Rails log
> confirms this, however I have a limited amount of records at the moment so
> benchmarks are properly inaccurate..

count(1) and count(*) are exactly the same thing (in existing PG
releases anyway), so whatever you're looking at is measurement noise.
count(id) would properly be slower because of the need to examine the
field to see if it's null.

            regards, tom lane