Toon posts:

[SQL] DISTINCT ON / kan dit wel in 1 query?

Pagina: 1
Acties:

Verwijderd

Topicstarter
met de volgende query haal ik drie rows op

code:
1
2
3
4
5
6
7
8
9
10
11
select userid, id, value1 from A 
    where 
        status in (1)
        and 
        userid in (
            select id from users 
                where
                    status = 1
        )
    order by id desc
    limit 3


dit werkt op zich prima. Maar het komt soms voor dat er 2 of 3 resultaten hetzelfde userid hebben, bijvoorbeeld

code:
1
2
3
4
    userid  id  value1
    244 2   bla
    244 5   bla2
    230 10  bla3


en dat wil ik niet.
Nu dacht ik dit op te gaan lossen met t volgende

code:
1
2
3
4
5
6
7
8
9
10
11
select DISTINT ON (userid) userid, id, value1 from A 
    where 
        status in (1)
        and 
        userid in (
            select id from users 
                where
                    status = 1
        )
    order by id desc
    limit 3


maar dan krijg ik ruzie met postgres
code:
1
ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions


en de ORDER BY moet op id liggen en niet op userid.

Kan ik dit uberhaupt wel met 1 query oplossen?
Ik gebruik hier PostgreSQL 7.2.1 en niet MySQL :)

  • Suffie
  • Registratie: Maart 2002
  • Laatst online: 21:07
ik snap niet precies wat je dan wil?
je wil dat userid maar 1x voorkomt in het rijtje?

I don't suffer from insanity, I enjoy every minute of it


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Verwijderd schreef op 12 november 2002 @ 11:53:
dit werkt op zich prima. Maar het komt soms voor dat er 2 of 3 resultaten hetzelfde userid hebben, bijvoorbeeld
code:
1
2
3
4
    userid  id  value1
    244 2   bla
    244 5   bla2
    230 10  bla3

en dat wil ik niet.

alle regels zijn DISTINCT. Jij wilt specifiek USERID isoleren, dus zal je moeten aangeven met een andere functie welke WEL weergegeven moet worden? De userid met de hoogste id ? met de hoogste value ? met de laagste value? etc etc. Distinct heb jij in iedergeval niet nodig :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Suffie schreef op 12 November 2002 @ 13:29:
ik snap niet precies wat je dan wil?
je wil dat userid maar 1x voorkomt in het rijtje?
jep

code:
1
SELECT userid, id FROM tabel A ORDER BY id DESC LIMIT 3;


maar nu moet in de resultaten daarvan userid uniek zijn. Dus als er een rij tussen zit met userid 12, dan mag dat bij de andere 2 rijen niet zo zijn.

k ben er inmiddels achter dat t met distinct niet gaat lukken. k heb nu wel een andere oplossing, maar die vind ik wat ranzig, omdat ik dmv een andere variable bij hou welk userid ik gehad heb.

  • Suffie
  • Registratie: Maart 2002
  • Laatst online: 21:07
ik denk niet dat dat mogelijk is aangezien userid niet uniek is hou je altijd het feit dat het meerdere keren voor kan komen

I don't suffer from insanity, I enjoy every minute of it


Verwijderd

Verwijderd schreef op 12 november 2002 @ 16:17:
maar nu moet in de resultaten daarvan userid uniek zijn. Dus als er een rij tussen zit met userid 12, dan mag dat bij de andere 2 rijen niet zo zijn.
Wat wil je dat er dan met die 2 andere rijen gebeurt? Mogen die niet getoond worden?

Verwijderd

Kun je de Distinct functie niet gebruiken in je subselectie?

Verwijderd

Topicstarter
Verwijderd schreef op 12 November 2002 @ 16:47:
[...]

Wat wil je dat er dan met die 2 andere rijen gebeurt? Mogen die niet getoond worden?
jawel, maar dat moeten dan twee rijen zijn waarin het userid van de andere niet voorkomt.

stel ik heb de volgende tabel
code:
1
2
3
4
5
6
7
8
id  userid
10  100
9   100
8   92
7   95
6   95
5   100
4   89


dan wil ik met een query krijgen
code:
1
2
3
4
id  userid
10  100
8   92
7   95


en niet
code:
1
2
3
4
id  userid
10  100
9   100
8   92


maar zonder t gebruik van functies lijkt dit niet te gaan lukken...

Verwijderd

Verwijderd schreef op 12 november 2002 @ 18:45:
jawel, maar dat moeten dan twee rijen zijn waarin het userid van de andere niet voorkomt.
[...]
dan wil ik met een query krijgen
[...]
en niet
volgens mij valt dan (zoals ik bedoelde) de rij met id = 9 en 100 dus weg? :?

Kun je dan niet "gewoon" onderstaande code gebruiken?
Ok, je hebt gelijk: zonder gebruik van een functie (in dit geval de min-functie) kom je idd niet uit
zo op 't eerste gezicht niet iig...
code:
1
2
3
4
5
6
7
select userid, id, value1 
from a
where userid + id in 
   (select userid + min(id) 
   from a 
   group by userid)
order by id

[ Voor 0% gewijzigd door Verwijderd op 12-11-2002 21:52 . Reden: order by id toegevoegd :o ]


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
En zo dan?

code:
1
2
3
4
5
6
7
8
9
10
11
12
select userid, id, value1 from A 
    where 
        status in (1)
        and 
        userid in (
            select DISTINCT id from users 
                where
                    status = 1
                       GROUP BY userid
        )
    order by id desc
    limit 3

Verwijderd

Ik neem aan dat je niet DISTINCT id maar DISTINCT userid bedoelt? Maar dat gaat niet werken, want of die userid nu in die subquery "gedistinct" wordt, dat maakt dan natuurlijk niet meer uit... :) (omdat je dan alsnog alle rijen terugkrijgt)

Verwijderd

Topicstarter
Verwijderd schreef op 12 november 2002 @ 21:55:
[...]

Ik neem aan dat je niet DISTINCT id maar DISTINCT userid bedoelt? Maar dat gaat niet werken, want of die userid nu in die subquery "gedistinct" wordt, dat maakt dan natuurlijk niet meer uit... :) (omdat je dan alsnog alle rijen terugkrijgt)
juist, omdat id de primary key voor de tabel users is.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

luister naar dusty :)

Who is John Galt?


Verwijderd

Ik heb toch een mogelijke implementatie gegeven van wat [u]dusty[/u] idd al aangaf? :)
Ik heb gekozen voor de minimum waarde en een beetje een vage implementatie genomen door de twee kolommen te concatteneren...
(Ik weet niet precies hoe dat in poStgReS gaat -ik heb 't ff snel getest op een MSDE en daar werkte 't, maar misschien krijg je problemen met mijn implementatie als je een userid van 11 en een id van 1 en een userid van 1 en een id van 11 hebt >:))

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

code:
1
2
3
4
5
6
7
8
9
10
select userid, max(id), max(value1)
from   A 
where  status in (1)
and    userid in
      (select id
       from   users 
       where  status = 1
      )
group by userid
order by userid desc


Dit is wat dusty bedoelde.
Je kunt records "weglaten" door ze samen te voegen met een aggregatie.

Wat je ook kan doen is een subquery maken die checked of er geen hoger record is. Alleen dan selecteer je 'm, dus met een NOT EXISTS subquery.
Pagina: 1