[SQL] dichtsbijzijnde waarde selecteren*

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 47459

Topicstarter
Ik zit even met een klein probleem..

Ik heb in een tabel een kolom met allemaal getallen. Nu neem ik uit een pagina een variabele mee, bijvoorbeeld 25.

In de desbetreffende kolom staan de getallen:
10
15
40
100

Het getal wat er het dichts bij komt is dus 25.

Wat is er hier de SELECT regel voor. Ik heb het al geprobeerd met LIKE % maar dat werkte helaas niet!

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:54

Janoz

Moderator Devschuur®

!litemod

Probeer eens voor jezelf duidelijk te omschrijven wat je wilt. Dat maakt het maken van een querie een stuk makkelijker. Je wilt de dichtsbijzijnde waarde selecteren? Wat is dichtsbijzijnde?

Als we nu eens het verschil tussen de waarde in de kolom en 25 nemen........

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Fulcrum2000
  • Registratie: Februari 2001
  • Laatst online: 02-12-2024

Fulcrum2000

Ik wil een threadripper...

select min(kolomnaam-waarde) from tabel group by whatever :?

AMD Ryzen 9 5950X | Asus ROG Strix X570-E Gaming | G.Skill Ripjaws V F4-3600C16D-32GVKC (64 GB total) + Samsung 980 Pro 1TB (M.2) | Corsair Hydro H100x


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Ja het verschil berekenen tussen de waardes en 25. Die met het kleinste verschil vervolgens selecteren. Dit moet mogelijk zijn.

Ik hoop voor je dat fulcrums oplossing werkt. Dit zou prachtig zijn.

[ Voor 23% gewijzigd door Noork op 04-12-2003 11:16 ]


Acties:
  • 0 Henk 'm!

  • Woef
  • Registratie: Juni 2000
  • Niet online
ja inderdaad en %like% is volgens mij alleen voor overeenkomsten. Dus 225 daar zit 25 in. Die is meer voor search doeleinden!

Acties:
  • 0 Henk 'm!

Anoniem: 47459

Topicstarter
Fulcrum2000 schreef op 04 december 2003 @ 11:15:
select min(kolomnaam-waarde) from tabel group by whatever :?
Ik ga deze methode eens proberen, degene met het kleinste verschil moet hem inderdaad zijn dan!

Acties:
  • 0 Henk 'm!

  • Fulcrum2000
  • Registratie: Februari 2001
  • Laatst online: 02-12-2024

Fulcrum2000

Ik wil een threadripper...

Nu ik het nog een keer nalees zie ik een potentieel probleem. Ik weet niet hoe MIN met negatieve getallen omgaat. Mogelijk krijg je nu het grootste negatieve getal terug. Indien dat het geval is moet je ergens nog een Abs(oluut) commando in zien te verwerken...

Vergeet ook niet dat kolomnaam een 'naam' is en geen waarde.

AMD Ryzen 9 5950X | Asus ROG Strix X570-E Gaming | G.Skill Ripjaws V F4-3600C16D-32GVKC (64 GB total) + Samsung 980 Pro 1TB (M.2) | Corsair Hydro H100x


Acties:
  • 0 Henk 'm!

Anoniem: 47459

Topicstarter
Ik ben dus even verder aan het proberen geweest... Ik kwam op dit:

code:
1
SELECT min(x_as-25) FROM onderdeel GROUP BY x_as WHERE x_as > 0

De waarde die eruit moet boven de 0 liggen, hij mag niet negatief zijn denk ik.

Acties:
  • 0 Henk 'm!

  • Fulcrum2000
  • Registratie: Februari 2001
  • Laatst online: 02-12-2024

Fulcrum2000

Ik wil een threadripper...

Dat gaat niet werken, nu checkt hij alleen of x_as groter dan 0 is, hij zou moeten checken of min(x_as-25) > 0 is

code:
1
SELECT min(abs(x_as-25)) FROM onderdeel GROUP BY x_as

AMD Ryzen 9 5950X | Asus ROG Strix X570-E Gaming | G.Skill Ripjaws V F4-3600C16D-32GVKC (64 GB total) + Samsung 980 Pro 1TB (M.2) | Corsair Hydro H100x


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Anoniem: 47459 schreef op 04 december 2003 @ 12:01:
De waarde die eruit moet boven de 0 liggen, hij mag niet negatief zijn denk ik.
ligt 24 dan niet dichter bij 25 dan 28 ?

Ik zou het zo eerder doen:
SELECT o1.x_as FROM onderdeel o1
WHERE o1.x_as = (SELECT MIN(ABS(o2.x_as - 25)) FROM onderdeel o2) + 25
OR o1.x_as = (SELECT MIN(ABS(o2.x_as - 25)) FROM onderdeel o2) - 25

En als je geen subselects kan doen, kan je het nog zo aanpakken:
SELECT o1.x_as, ABS(o1.x_as - 25) as verschil FROM onderdeel o1 ORDER BY verschil limit 1

Alle queries hierboven geven je het kleinste verschil terug, niet de waarde die het dichts bij de x_as ligt.

[ Voor 18% gewijzigd door ACM op 04-12-2003 12:14 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:23
Aangenomen dat het niet uitmaakt of je de gewenste waarde (25) van onder of van boven benadert, klopt 'ie gewoon. ABS(x-25) geeft het verschil tussen x en 25 en dat wil je minimaliseren.
Pagina: 1