sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL - kolumnvärde ändrat - välj sökningsoptimering

Så här skulle jag göra med en analytisk:

SELECT id, val
  FROM ( SELECT id, val
           ,LAG(val) OVER (ORDER BY id) AS prev_val
       FROM p ) x
  WHERE val <> COALESCE(prev_val, val)
  ORDER BY id

Uppdatering (viss förklaring):

Analytiska funktioner fungerar som ett efterbearbetningssteg. Frågeresultatet är uppdelat i grupperingar (partition by ) och den analytiska funktionen tillämpas inom ramen för en gruppering.

I det här fallet är frågan ett urval från p . Den analytiska funktionen som tillämpas är LAG . Eftersom det inte finns någon partition by sats, det finns bara en gruppering:hela resultatuppsättningen. Denna gruppering är sorterad efter id . LAG returnerar värdet på föregående rad i grupperingen med den angivna ordningen. Resultatet är att varje rad har en extra kolumn (alias prev_val) som är val av föregående rad. Det är underfrågan.

Sedan letar vi efter rader där val matchar inte val av föregående rad (prev_val). COALESCE hanterar specialfallet för den första raden som inte har ett tidigare värde.

Analytiska funktioner kan verka lite konstiga till en början, men en sökning på analytiska funktioner hittar många exempel som går igenom hur de fungerar. Till exempel:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Kom bara ihåg att det är ett efterbearbetningssteg. Du kommer inte att kunna utföra filtrering etc på värdet av en analytisk funktion om du inte undersöker den.



  1. Hur man tar bort upprepade rader i en Oracle SQL-fråga

  2. Tillgång till en fjärrstyrd mysql db i trigger

  3. MySQL:Infoga datetime i andra datetime-fält

  4. Hur uppgraderar jag WordPress och installerade plugins för live-webbplatsen till de senaste tillgängliga versionerna utan att möta några problem?