verwendetes Datenbanksystem: SQL Server 2005
Hi,
habe folgendes select mit dem zugehörigen output:
SELECT *
FROM tbl
WHERE IDName LIKE 'XX'
ORDER BY datCreated;
______________________________________________________________________________________
PrimaryKey|IDName|IDOrt|datCreated |Dauer des Aufenthalts |
__________|______|_____|_______________________|______________________________________|
000001 |XX |A |2000-01-01 13:56:42.000|datCreated 000001 - datCreated 000002 |
000002 |XX |B |2000-02-16 08:13:15.000|datCreated 000002 - datCreated 000003 |
000003 |XX |C |2000-03-18 14:13:58.000|datCreated 000003 - datCreated 000004 |
000004 |XX |A |2000-04-22 12:33:17.000|???? |
meine frage bezieht sich auf das erstellen des Ergebnisses der Spalte "Dauer des Aufenthalts"
kann mir jemand auf die sprünge geben oder einen ansatz (muss nicht gleich die komplette lösung sein) wie ich das entsprechende ergebnis von
datum aktueller datensatz - datum direkter nachfolger datensatz
erhalte?
ich weiß es gibt die DATEDIFF() Funktion aber mein problem ist es, beim endwert den direkten nachfolger zu bekommen.
wie gesagt es muss keine komplette lösung sein 😉 ein hinweis oder denkanstoss tut auch gut 😉
saludos
mex
que? como? no entiendo!!!!!
Hallo,
habs nicht getestet aber so in der Art
SELECT PrimaryKey, IDName, IDOrt, (
SELECT DATEDIFF(...)
FROM Tabelle AS t2
WHERE t2.dateCreated <= t1.dateCrated
) AS DauerAufenthalt
FROM Tabelle AS t1
ORDER BY t1.dateCreated
Also per Unterabfrage.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Ist jetzt Zufall, aber wie bereits in dem anderen Thread ist hier ebenfalls ROW_NUMBER die Lösung. Ich schätze mal die Differenz soll abhängig von IDName ermittelt werden.
Versuch mal das hier:
; WITH cte (IDName, IDOrt, datCreated, RowNum) AS
(
SELECT
IDName,
IDOrt,
datCreated,
ROW_NUMBER() OVER (PARTITION BY IDName ORDER BY datCreated ASC)
FROM tbl
)
SELECT
IDName,
IDOrt,
DATEDIFF(DAY, t2.datCreated, t1.datCreated)
FROM cte t1
JOIN cte t2 ON t1.IDName = t2.IDName AND t1.RowNum = t2.RowNum + 1
WHERE RowNum = 1
@gfoidl:
Schätze war ein Schreibfehler, aber die Subquery muss mit MAX arbeiten und darf nicht "≤" als JOIN Kriterium verwenden da sonst immer der Wert von außen verwendet wird. Die Subquery sollte wohl wie folgt aussehen:
SELECT DATEDIFF(DAY, t1.datCreated, MAX(t2.datCreated))
FROM Tabelle AS t2
WHERE t2.dateCreated < t1.dateCrated
Problem ist aber dass das extrem auf die Performance geht. Zum einen weil es eh schon eine Inline-Subquery ist, zum ist das aber ein dreieckiger JOIN der einem Aufwand von ca. O(n^2) entspricht.
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
moin,
danke für die antworten 😉
die erste mit der subquery hab ich versucht - und ich muss leider sagen, ich hab es nicht zum laufen gebracht.
select t1.PrimaryKey, t1.IDName, t1.IDOrt, t1.datCreated,
(select DATEDIFF(day, t2.datCreated, MAX(t1.datCreated))
from tbl... AS t2
where t1.datCreated < t2.datCreated)
AS DauerAufenthalt
from tbl... AS t1
where t1.IDName LIKE 'XX'
ORDER BY t1.datCreated;
Msg 8120, Level 16, State 1, Line 1
Column 'tblxxx.PrimaryKey' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
das ein ausschnitt aus der fehlermeldung 😉
ich werde mich jetzt an dem nächsten vorschlag versuchen
salduos mex
que? como? no entiendo!!!!!
Hallo,
wenn du die Fehlermeldung postest, bitte auch die dazugehörige Query, sonst muss man wieder rumraten.
**:::
so die zweite möglichkeit mit dem rowcount ausprobiert.
die view funktioniert,
das select funktioniert,
ABER:
das Ergebnis das angezeigt werden soll bleibt aus. die query wird erfolgreich ausgeführt, aber es erscheint kein inhalt
hmmm,
das hab ich wohl auch verzockt. dennoch danke 😦
und jetzt auf zu versuch drei
saludos
ps: fehlermeldung hab ich gepostet
que? como? no entiendo!!!!!
Wie gesagt, ohne dein akt. Query kann man nicht viel helfen.
**:::
Wie gesagt, ohne dein akt. Query kann man nicht viel helfen.
so, aber jetzt.... s.h. oben... war mit dem kopf anscheinend woanderst
akt. query s.h. oben
que? como? no entiendo!!!!!
Du benutzt die Aggregatfunktion MAX. Solche Funktionen benötigen immer ein GROUP BY. Dieses fehlt in deinem Inner-Select.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
War noch ein Fehler in meinem Statement. Ich habe mir jetzt selber mal Testdaten zusammen geklopft...
Versuch das mal:
DECLARE @tbl TABLE (IDName INT, IDOrt INT, datCreated DATETIME)
INSERT INTO @tbl
SELECT 1, 1, '2009-06-01'
UNION ALL SELECT 1, 1, '2009-06-02'
UNION ALL SELECT 1, 2, '2009-06-04'
UNION ALL SELECT 1, 2, '2009-06-06'
UNION ALL SELECT 2, 1, '2009-06-10'
UNION ALL SELECT 2, 1, '2009-06-13'
UNION ALL SELECT 2, 2, '2009-06-16'
; WITH cte (IDName, IDOrt, datCreated, RowNum) AS
(
SELECT
IDName,
IDOrt,
datCreated,
ROW_NUMBER() OVER (PARTITION BY IDName ORDER BY datCreated)
FROM @tbl
)
SELECT
t1.IDName,
t1.IDOrt,
t2.datCreated [Von],
t1.datCreated [Bis],
DATEDIFF(DAY, t2.datCreated, t1.datCreated)
FROM cte t1
LEFT JOIN cte t2 ON t1.IDName = t2.IDName AND t1.RowNum = t2.RowNum + 1
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.