Re: count (DISTINCT field) OVER ()

From: Tarlika Elisabeth Schmitz <postgresql6(at)numerixtechnology(dot)de>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: count (DISTINCT field) OVER ()
Date: 2011-11-10 10:24:38
Message-ID: 20111110102438.33adf89a@dick.coachhouse
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Thu, 10 Nov 2011 10:02:36 +0100
Thomas Kellerer <spam_eater(at)gmx(dot)net> wrote:

>Tarlika Elisabeth Schmitz, 10.11.2011 00:52:
>> I would like to implement the equivalent of "count (DISTINCT id)
>> OVER ()":
>>
>>[...]
>>
>> produces result:
>> id, name, delta, cnt
>> 1787 Toomyvara 0.5 4
>> 1787 Toomevara 0.4 4
>> 1700 Ardcroney 0.105 4
>> 1788 Townsfield 0.1 4
>>
>
>This should do it:
>
>SELECT id,
> name,
> delta,
> sum(case when rn = 1 then rn else null end) over() as
> distinct_id_count
>FROM (
> SELECT
> id, name, similarity(name, 'Tooneyvara') as delta,
> row_number() OVER(partition by id) AS rn
> FROM vtown
> WHERE
> similarity(name, 'Tooneyvara') > 0.1
>) t
>ORDER BY delta DESC
>

I like you suggestion, Thomas. It is not that dissimilar from but
cleaner than my original SELECT ... FROM (SELECT DISTINCT ON(id)
attempt.
It's also very slightly faster.

Here's another, slightly shorter, variation of your suggestion:

SELECT id, name, delta,
max(rank) OVER() as cnt
FROM (
SELECT
id, name, similarity(name, 'Tooneyvara') as delta,
dense_rank() OVER(ORDER BY id) AS rank
FROM vtown
WHERE
similarity(name, 'Tooneyvara') > 0.1
) t
ORDER BY delta DESC

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Thomas Kellerer 2011-11-10 10:45:22 Re: count (DISTINCT field) OVER ()
Previous Message daflmx 2011-11-10 09:04:10