webForumDet fria alternativet

Plocka värden

15 svar · 465 visningar · startad av AG

AGMedlem sedan mars 20001 266 inlägg
#1

Jag har en databas som innehåller tabeller med valutavärden, dag för dag. Dock hämtas ej data på helgdagar och vissa andra dagar.
Tabell euro_tbl
id
name (Ex USD, EUR, SEK)
value -double (Ex. 2.72)
date (Ex. 2004-01-22)

Tabell name_tbl
id
name (Svensk Krona)
prfx (SEK)

Nu skulle jag vilja göra en sqlsats som listar de senaste värdena
jämför med de från mätningen innan (observera att senaste mätning innan kan vara 1,2,3,4 dagar tillbaka). Den skall också hämta "name" från name_tbl genom att jämföra "prfx" mot "name"

Alltså listningen skall bli något istil med:

EMU Euro	EUR	9.25	0.03
USA Dollar	USD	7.39	-0.04
Dansk Krone	DKK	1.20	0.02
...

tack
Andreas

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Ja, den typen av frågor blir ju väldigt lättbegripliga och intuitiva med Mysql ...

select n.name, n.prfx, e1.val, e1.val - e3.val
 from name_tbl n join euro_tbl e1
   on n.prfx = e1.name
 join euro_tbl e2
   on e1.name = e2.name
 join euro_tbl e3
   on e2.name = e3.name
  and e3.vdat < e2.vdat
 join euro_tbl e4
   on e3.name = e4.name
  and e4.vdat < e2.vdat
group by n.name, n.prfx, e1.val,e1.vdat, e3.val, e3.vdat
having max(e2.vdat) = e1.vdat
and max(e4.vdat) = e3.vdat

Flyttas från Mysql.

Engine^Medlem sedan dec. 20003 887 inlägg
#3

LarsG: Kommer man verkligen undan med det utan att ha med e1.val - e3.val eller 3 i GROUP BY? Räcker det att ha med e1.val och e3.val i grupperingen?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Kommer man verkligen undan med det utan att ha med e1.val - e3.val

Jo

eller 3

Var har du lärt dig sådana olater?

Enligt standard så får det bara vara kolumner i group by.

AGMedlem sedan mars 20001 266 inlägg
#5

Får det tyvärr ej fungera,, när jag skriver in det i mysqlfront får jag felet "Unknown column 'e1.vdat' in 'having clause'"

Andreas

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Byt vdat mot namnet på den kolumn som inehåller datum.

AGMedlem sedan mars 20001 266 inlägg
#7

Det är det som är det konstiga, det hade jag gjort.
Fältet heter vdat och är ett varchar fält.

Andreas

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Då förstår jag inte. (Jag hittade på vdat eftersom date är ett reserverat ord i SQL och därmed inte inte är tillåtet som kolumnnamn.)

I och för sig så skall du byta datatyp från varchar till date men det är ju en annan sak.

AGMedlem sedan mars 20001 266 inlägg
#9

Skum, såhär skriver MYSQL-front ut den:

select n.name, n.prfx, e1.value, e1.value - e3.value
 from name_tbl n join ecb_tbl e1
   on n.prfx = e1.name
 join ecb_tbl e2
   on e1.name = e2.name
 join ecb_tbl e3 
   on e2.name = e3.name
  and e3.vdat < e2.vdat
 join ecb_tbl e4
   on e3.name = e4.name
  and e4.vdat < e2.vdat
group by n.name, n.prfx, e1.value, e1.vdat, e3.value, e3.vdat
having max(e2.vdat) = e1.vdat and max(e4.vdat) = e3.vdat

Tabellerna ser ut på följande sätt:

Tabell finance

ecb_tbl
Id (tinyint(6))
name (char(3))
value (double)
vdat (date)

name_tbl
Id (tinyint)
name(varchar(55))
prfx(char(3))

tack
Andreas

LarsGMedlem sedan dec. 200012 464 inlägg
#10

Som sagt så förstår jag inte vad som är felet. Jag har skapat tabellerna och testat frågan (i en annan DBMS än Mysql) utan att få något fel.

Engine^Medlem sedan dec. 20003 887 inlägg
#11

Då återstår det väl några små saker att testa.

Felstavningar?

Bryt ner frågan i mindre delar.

select n.name, n.prfx, e1.value, e1.value - e2.value
 from name_tbl n
 join ecb_tbl e1
   on n.prfx = e1.name
 join ecb_tbl e2
   on e1.name = e2.name
group by n.name, n.prfx, e1.value, e1.vdat, e2.vdat
having max(e2.vdat) = e1.vdat

Klarar din version av MySQL av någon anledning inte av en HAVING-klausul med tabellalias?

Är det ogiltiga data i någon av kolumnerna?

AGMedlem sedan mars 20001 266 inlägg
#12

Funderar på detta, kan det vara så att MySQL-front inte har stöd för having?

Andreas

AGMedlem sedan mars 20001 266 inlägg
#13

Testade att köra ut den i en jsp-böna, får samma fel:

sql : com.mysql.jdbc.PreparedStatement@eb7331: select n.name, n.prfx, e1.value, e1.value - e2.value from name_tbl n join ecb_tbl e1 on n.prfx = e1.name join ecb_tbl e2 on e1.name = e2.name group by n.name, n.prfx, e1.value, e1.vdat, e2.vdat having max(e2.vdat) = e1.vdat
AGMedlem sedan mars 20001 266 inlägg
#14

Har sparat ner databasen för test:
http://www.digital-network.nu/finance.sql

Andreas

AGMedlem sedan mars 20001 266 inlägg
#15

Fick sql-satsen att fungera i några månader, sedan blev jag kontaktad av webbhotellet som menade att denna uträkning tog för mycket resurser.
Fick ett svar någonstans att det var Having-delen som drog ner databasen i träsket.

Tänkte då att det skull räcka ifall man bara kontrollerade value på 'vdat' och 'vdat-1', finns ej 'vdat-1' så skrivs inget ut.

Någon som har en tanke, idé på hur man skulle ställa upp denna sql-sats, med mål att göra den så prestandaeffektiv som möjligt.

select 
   n.name, 
   n.prfx, 
   e1.value, 
   e1.value - e3.value,
   e1.vdat,
   e3.vdat
from 
   name_tbl n 
       join ecb_tbl e1 on n.prfx = e1.name
       join ecb_tbl e2 on e1.name = e2.name
       join ecb_tbl e3 on e2.name = e3.name and e3.vdat < e2.vdat
       join ecb_tbl e4 on e3.name = e4.name and e4.vdat < e2.vdat
group by 
   n.name, 
   n.prfx, 
   e1.value, 
   e1.vdat,
   e3.value, 
   e3.vdat
having 
   max(e2.vdat) = e1.vdat and 
   max(e4.vdat) = e3.vdat

tack
Andreas

AGMedlem sedan mars 20001 266 inlägg
#16

Ingen reaktion på lösning än, så jag funderar.

Man skulle kunna lösa det på själva presentationsdelen, dvs i mitt fall i en Javaböna, att man plockar data från två separata sqlsatser typ, select top 1 * from ecb_tbl order by...' resp select top 2 ' from ecb_tbl order by...' men detta känns inte som en snygg lösning. Skulle gärna vilja lösa det med en sql-fråga.

Andreas

136 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)