Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] -1 dag met missende dagen?

Pagina: 1
Acties:

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
Hallo,

Ik heb een table in mijn DB waarin ik de Openings en Sluitingskoersen van de nikkei van de afgelopen 30 jaar heb staan. Nu wil ik er een veld aan toevoegen waarin het verschil staat in procenten tussen de openingskoers van de dag en de sluitingskoers van de dag ervoor. Ik weet echter niet helemaal hoe ik dit moet doen. Ik had eerst het volgende gemaakt:

UPDATE nikkei SET SLOTvsOPEN = ((Open - Slot DATE_SUB(betreffende dag,INTERVAL 1 DAY)/Slot DATE_SUB(betreffende dag,INTERVAL 1 DAY))*100)

Dit klopt natuurlijk van geen kanten. Ik heb namelijk twee problemen:
  1. Hoe haal ik het `Slot` van de handelsdag ervoor in dezelfde query op zodat ik die in een berekening kan combineren met het `Open` van de huidige dag.
  2. En dan nog een stapje verder terug. Er wordt natuurlijk niet elke dag gehandeld (ivm weekends en feestdagen). Hoe haal ik de "laatste handelsdag vóór de handelsdag van het te bewerken record"?
Ik hoop dat jullie mij een paar tips kunnen geven. Ik weet namelijk niet hoe ik verder moet? |:(

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Wil je ineen je hele tabel updaten, of wil je ook selectief kunnen updaten? En wil je het per se in een enkele query doen, of mag het ook in een procedure? Afhankelijk hiervan is het prima mogelijk om je doel te bereiken.

Mogelijke oplossingsrichtingen:
1) In een procedure: query gewoon alles gesorteerd op datum, loop erover (waarbij je de vorige sluitingskoers onthoudt) en update de regel die je in je loop tegenkomt (waarbij verschil=current_open/prev_close).
2) In een query: maak een dubbele subquery waarbij je eerst de maximale datum selecteert die vroeger is dan de huidige datum, en daarna de sluitkoers van die dag ophaalt.

When life gives you lemons, start a battery factory


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
@ KoubouterSuper
Dankje voor de tips. Ik wil het het liefst in een subquery doen. Ik begrijp daar nog niet veel van maar wil er wel meer over leren, gezien ik denk dat ik het nog wel vaker tegen zal gaan komen..

Eens denken..

UPDATE nikkei
SET SLOTvsOPEN = ((SELECT Open FROM nikkei WHERE ??????) - (SELECT Slot FROM nikkei WHERE Datum = MAX(DATE_SUB(Datum,INTERVAL 1 DAY))/(SELECT Slot FROM nikkei WHERE Datum = MAX(DATE_SUB(Datum,INTERVAL 1 DAY))*100)

Ik kom dan met iets als bovenstaands. Ik heb alleen geen flauw idee wat er bij de vraagtekens moet staan. Is dat een beetje in de richting..?


SELECT *
FROM nikkei
WHERE date = (SE

[ Voor 4% gewijzigd door kramer65 op 12-04-2011 17:02 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
UPDATE nikkei n1
SET SlotVsOpen = (
  Open - (
    SELECT Slot 
    FROM nikkei n2
    WHERE n2.DatumVeld = DATE_SUB(n1.DatumVeld, INTERVAL 1 DAY)
  )
) / (
  SELECT Slot
  FROM nikkei n2
  WHERE n2.DatumVeld = DATE_SUB(n1.DatumVeld, INTERVAL 1 DAY)
) * 100
WHERE RowId > IdVanDeEersteRij

Zoiets? Ongetest overigens. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
NMe schreef op dinsdag 12 april 2011 @ 17:00:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
UPDATE nikkei n1
SET SlotVsOpen = (
  Open - (
    SELECT Slot 
    FROM nikkei n2
    WHERE n2.DatumVeld = DATE_SUB(n1.DatumVeld, INTERVAL 1 DAY)
  )
) / (
  SELECT Slot
  FROM nikkei n2
  WHERE n2.DatumVeld = DATE_SUB(n1.DatumVeld, INTERVAL 1 DAY)
) * 100
WHERE RowId > IdVanDeEersteRij

Zoiets? Ongetest overigens. :)
Ik heb hem nog niet getest, maar hier zit dan het feit dat er veel dagen worden overgeslagen (weekends en feestdagen) toch nog niet in..?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Nee, maar dan wordt je query dus nog een stukje ingewikkelder. Je zou dan beide voorkomens van DATE_SUB(n1.DatumVeld, INTERVAL 1 DAY) moeten vervangen door iets als (SELECT MAX(n3.DatumVeld) FROM nikkei n3 WHERE n3.DatumVeld < n1.DatumVeld). Dat, of je moet een MySQL-specifieke LIMIT gebruiken, maar die heeft sowieso ook dat derde subquery-niveau nodig.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
Ok, dus zoiets:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
UPDATE nikkei n1
SET SlotVsOpen = (
  Open - (
    SELECT Slot 
    FROM nikkei n2
    WHERE n2.DatumVeld = (
      SELECT MAX(n3.DatumVeld)
      FROM nikkei n3 
      WHERE n3.DatumVeld < n1.DatumVeld
    )
  )
) / (
  SELECT Slot
  FROM nikkei n2
  WHERE n2.DatumVeld = (
      SELECT MAX(n3.DatumVeld)
      FROM nikkei n3 
      WHERE n3.DatumVeld < n1.DatumVeld
    )
) * 100
WHERE RowId > IdVanDeEersteRij


De query moet overigens over de gehele table gaan. Dan kan ik die laatste WHERE clausule toch gewoon weglaten..?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Nee, want je eerste record heeft geen "gisteren" om mee te vergelijken. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 10-11 15:08
NMe schreef op dinsdag 12 april 2011 @ 17:41:
Nee, want je eerste record heeft geen "gisteren" om mee te vergelijken. ;)
Ehm.. dus dan krijg ik toch gewoon één keer een error..?

Ik heb de query overigens net getest en hij geeft een error: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ) ) / ( SELECT Slot FROM nikkei n2 WHERE n2.Datum = ( SELE' at line 10
Enig idee wat daar fout is..? :$


Okee, ik had zelf een foutje gemaakt. Nu heb ik hem weer getest en krijg ik er de volgende error uit: #1093 - You can't specify target table 'n1' for update in FROM clause

Enig idee wat er dan fout is..? :$

[ Voor 16% gewijzigd door kramer65 op 12-04-2011 20:19 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

kramer65 schreef op dinsdag 12 april 2011 @ 19:00:
[...]

Ehm.. dus dan krijg ik toch gewoon één keer een error..?
...of je zorgt gewoon dat het niet voorkomt met die where? :P
Nu heb ik hem weer getest en krijg ik er de volgende error uit: #1093 - You can't specify target table 'n1' for update in FROM clause

Enig idee wat er dan fout is..? :$
Urgh, blijkbaar een MySQL-quirk: http://stackoverflow.com/...for-update-in-from-clause

De workaround is blijkbaar nóg een extra select er omheen zetten zoals omschreven in het accepted answer daar. 8)7

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
Van waar komen je cijfers? Ik ben op zoek naar beurscijfers, het liefst van al realtime. Maar ik ben anders ook gewoon op zoek naar zo'n set.

[ Voor 41% gewijzigd door Precision op 12-04-2011 21:37 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?

Pagina: 1