MySql gültige Daten finden

Kalito

Erfahrenes Mitglied
Hallo, ich habe eine Tabelle, in denen Werte versioniert gespeichert werden. Ein Datensatz ist solange gültig, bis die Gültigkeit eines neuen Datensatzes beginnt.
Code:
value | time
1      | 2012-11-01 11:10:55
2      | 2012-11-01 12:10:55
3      | 2012-11-01 15:10:55

Value 1 ist quasi von 11:10 bis 12:10 gültig und value 2 dann bis 15:10h. Wie bekomme ich nun den valuewert, welcher 13.00h gültig war (hier die 2)?

Danke und Gruß,
Kalito
 
a) Alles abfragen, was früher als 13:00 war
b) Per order by umdrehen, dass das Späteste als Erstes kommt
c) Mit limit auf ein Ergebnis reduzieren
 
Falls das Tabellendesign noch offen ist, würde ich dir für dieses Problem stark die Konzepte von Slowly Changing Dimensions Type 2 ans Herz legen.
 
Hallo,

am Design kann ich nicht viel ändern. Ich darf nur die Abfrage ausführen. Leider ist noch eine Änderung reingekommen. Es ist eine Spalte Land hinzugekommen und ich muss für jedes Land die gültigen Werte ausgeben. Ändert sich da ebenfalls die Abfrage?

Gruß
 
In Oracle/MS/DB2/Postgre wäre das echt einfach

SQL:
select 
  *
from (
  select
    country,
    value,
    time,
    rank() over (partition by country order by time desc) as time_rank
    -- oder geht auch mit rn
    -- row_number() over (partition by country order by time desc) as time_rn
  from
    my_table
  where 
    time < to_timestamp('01/11/2012 15:00.00', 'dd/mm/yyyy hh24:mi.ss') 
)
where 
  time_rank = 1
  -- oder eben mit rn
  -- time_rn = 1
;

In MySQL gibt's keine Analytical Functions. Da ich aber MySQL selber nicht so kenne, kann ich nicht genau sagen was ein Workaround wäre. Es gibt aber welche. Schau mal hier und spiel etwas rum:
http://stackoverflow.com/questions/1895110/row-number-in-mysql
 
Zuletzt bearbeitet von einem Moderator:
So ich habe jetzt eine endgültige Tabelle.
Sie hat die Spalten source, country, value und time.

Ich soll nun für jede Produkt-Land-Kombination für einen bestimmten Zeitpunkt den gültigen Value finden. Ein Value ist vom timestamp an so lange gültig, bis für die Produkt-Land-Kombination ein neuer Datensatz eingetragen wird.

Mein Problem ist einfach, dass ich die einzelnen Produkt-Land Kombinationen ermitteln und dann für jeden die jeweilige Menge aufrufen kann. Klar ich könnte jede Kombination als einzelnen Befehl schreiben und dann mit Union arbeiten, aber das ist ja nicht die Sache des Erfinders.

Gruß, Kalito
 
Mit MySQL

SQL:
SELECT
	my_table.*
FROM
	my_table
	INNER JOIN (
		-- Pro Kombination source/country das grösste Datum aussuchen
		SELECT
			source,
			country,
			MAX(time) AS max_time
		FROM
			my_table
		-- Falls du die gültigen Einträge eines Bestimmten Datums brauchst, hier einen WHERE einfügen
		-- WHERE
 		--	time < '2013-02-20'
		GROUP BY
			source,
			country
	) AS last_entries
	ON last_entries.source = my_table.source
	AND last_entries.country = my_table.country
	AND last_entries.max_time = my_table.time
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück