sachsenhessi
Goto Top

Problem mit Erstellung einer View

Hallo @all,

ich finde für folgendes Problem keine Lösung:
Gegeben ist eine Tabelle mit zwei Spalten ([ObjektID] als Integer, [TermineEVT] als Datetime).
Gesucht werden die letzten zwei [TermineEVT] zu einer [ObjektID] als Spalten (für die Berechnung von Differenzen).
Also rauskommen sollte Etwas in der Form:
[ObjektID] [LetztesDatum] [VorletztesDatum]
folgendes Statement würde das liefern:
	SELECT TOP 1 ObjektID, MAX(EVT) AS LetztesDatum,
                             (SELECT        MAX(EVT) AS MaxVonEVT
                               FROM            dbo.TermineEVT AS i
                               WHERE        (ObjektID = o.ObjektID) AND (EVT < o.EVT)) AS VorletztesDatum
	FROM dbo.TermineEVT AS o
	WHERE objektid = 2121
	GROUP BY ObjektID, EVT
        ORDER BY LetztesDatum DESC
Ergebnis:
t1_2018-09-14_132008
Leider könnte ich das nur ObjektID für ObjektID erledigen (ginge evtl. über eine UDF).
Ich benötige aber eine View mit allen Objekten.

Mit
	SELECT ObjektID, MAX(EVT) AS LetztesDatum,
                             (SELECT        MAX(EVT) AS MaxVonEVT
                               FROM            dbo.TermineEVT AS i
                               WHERE        (ObjektID = o.ObjektID) AND (EVT < o.EVT)) AS VorletztesDatum
	FROM dbo.TermineEVT AS o
	GROUP BY ObjektID, EVT
       ORDER BY objektID, LetztesDatum DESC
bekomme ich nur:
t2_2018-09-14_132804
Ich benötige jedoch nur die gelb markierten Zeilen. Also den Datensatz zu jeder ID mit der MAX(LetztesDatum)

Ich kriege es ums verr... nicht gebacken.
Hat jemand von Euch eine Idee ? (Und ja, ich habe Tante google befragt, aber die Frage war wohl falsch gestellt.)
Zielsystem wäre MS-SQL2014.
Vielen Dank im Voraus
Frank

Content-Key: 386510

Url: https://administrator.de/contentid/386510

Printed on: July 19, 2024 at 17:07 o'clock

Member: emeriks
emeriks Sep 14, 2018 at 13:07:06 (UTC)
Goto Top
Hi,
Leider könnte ich das nur ObjektID für ObjektID erledigen (ginge evtl. über eine UDF).
Versuche mal, zu ersetzen:
Statt
WHERE objektid = 2121
WHERE objektid IN (SELECT DISTINCT ObjektID FROM dbo.TermineEVT)
Member: SachsenHessi
SachsenHessi Sep 14, 2018 updated at 13:32:05 (UTC)
Goto Top
Hallo @emeriks,

hat leider den selben Effekt wie:
	SELECT ObjektID, MAX(EVT) AS LetztesDatum, 
                             (SELECT        MAX(EVT) AS MaxVonEVT 
                               FROM            dbo.TermineEVT AS i 
                               WHERE        (ObjektID = o.ObjektID) AND (EVT < o.EVT)) AS VorletztesDatum 
	FROM dbo.TermineEVT AS o 
	GROUP BY ObjektID, EVT 
        ORDER BY objektID, LetztesDatum DESC

Das ich den gewünschten DS bekomme bei:
	
SELECT TOP 1 ObjektID, MAX(EVT) AS LetztesDatum, 
                             (SELECT        MAX(EVT) AS MaxVonEVT 
                               FROM            dbo.TermineEVT AS i 
                               WHERE        (ObjektID = o.ObjektID) AND (EVT < o.EVT)) AS VorletztesDatum 
	FROM dbo.TermineEVT AS o 
	WHERE objektid = 2121 
	GROUP BY ObjektID, EVT 
        ORDER BY LetztesDatum DESC
liegt ja am TOP 1 . Das mir im Prinzip den gewünschten DS "filtert".
Trotzdem vielen Dank für Deine Mühe.
Frank
Member: emeriks
emeriks Sep 14, 2018 updated at 14:25:02 (UTC)
Goto Top
Möglicherweise so?

SELECT  ObjektID, [EVT] AS LetztesDatum,
                             (SELECT        MAX([EVT]) AS MaxVonEVT
                               FROM            [TermineEVT] AS T3
                               WHERE        (T3.ObjektID = T1.ObjektID) AND (T3.[EVT] < T1.[EVT])) AS VorletztesDatum
	FROM [TermineEVT] AS T1
	WHERE [EVT] IN (SELECT TOP 1 Max(EVT) FROM [TermineEVT] AS T2 WHERE T2.ObjektID = T1.ObjektID)

Edit: Doch, das sollte funktionieren.
Member: SachsenHessi
SachsenHessi Sep 14, 2018 at 17:23:15 (UTC)
Goto Top
Danke @emriks,
das werde ich Montag mal testen.
Bis dahin schönes WE.
LH
Frank
Member: SachsenHessi
SachsenHessi Sep 17, 2018 at 06:22:32 (UTC)
Goto Top
Hallo @emeriks,

klappt leider auch nicht face-sad
t3_2018-09-17_081837

Da komme ich wohl um eine UDF nicht herum face-sad

Trotzdem vielen dank für Deine Mühe
Frank
Member: emeriks
emeriks Sep 17, 2018 at 06:44:55 (UTC)
Goto Top
Hm, OK. Schade für Dich. face-wink
Ich habe sowas ähnliches auch vor ein paar Monaten gebraucht. Dies hatte ich am Freitag einfach adaptiert. Beim Test an einer ähnlichen Tabelle bei mir funktioniert das so ...
Member: MadMax
MadMax Sep 24, 2018 at 14:39:04 (UTC)
Goto Top
Hallo Frank,

bischen spät, ich weiß, aber probier es mal hiermit:
select	ObjektID,
	LetztesDatum,
	(select top (1) EVT from TermineEVT where ObjektID = o.ObjektID and EVT < o.LetztesDatum order by EVT desc) as VorletztesDatum
from	(select	ObjektID,
		max (EVT) as LetztesDatum
	from	TermineEVT
	group by ObjektID) o

Gruß, Mad Max
Member: SachsenHessi
SachsenHessi Oct 02, 2018 at 07:30:52 (UTC)
Goto Top
Hallo,

Sorry, bin zur Zeit im Urlaub.
Ich werde es testen, sobald ich es zeitlich schaffe.

Vielen Dank
Frank