MSSQL: Zeile nach Datums bereich auswählen

Zvoni

Erfahrenes Mitglied
Und hier mit der Erweiterung immer nur die Monatsersten anzuzeigen:
Achtung: Ist in SQLite, für MSSQL musst du den Dialekt finden.
SQL:
SELECT
A1.mrID,
A1.Datum,
A1.mrNewFieldValue
FROM
(WITH cte As (
    SELECT
    mrID,
    Date(Min(mrTimeStamp)) As MinStamp,
    Date(Max(mrTimeStamp)) As MaxStamp
    FROM
    tickets2
    GROUP BY mrID
)
SELECT
cte.mrID,
dates.datum,
(
SELECT T1.mrNewFieldValue
FROM tickets2 T1
WHERE
T1.mrID=cte.mrID AND
Date(T1.mrTimeStamp)<=dates.datum
ORDER BY T1.mrTimeStamp DESC LIMIT 1) As mrNewFieldValue

FROM
cte
LEFT OUTER JOIN
dates
ON
dates.datum BETWEEN cte.MinStamp AND cte.MaxStamp) As A1
WHERE
A1.mrID=401057 AND
Date(A1.Datum)=Date(A1.Datum,'start of month')

Ergebnis für ID 401057
mrIDdatummrNewFieldValue
4010572010-12-01Feedback__bReceived
4010572011-01-01Feedback__bReceived
 

Zvoni

Erfahrenes Mitglied
Für die Calendar-Table (Achtung: Das ist ein Brett!)
SQL:
create table dates (id integer primary key);
insert into dates default values;
insert into dates default values;
insert into dates select null from dates d1, dates d2, dates d3 , dates d4;
insert into dates select null from dates d1, dates d2, dates d3 , dates d4;
alter table dates add date datetime;
update dates set date=date('2000-01-01',(-1+id)||' day');
Ist für SQLite. Kann für MSSQL anderst sein.
 

Zvoni

Erfahrenes Mitglied
Und hier dasselbe aber ohne Calendar-Table!
Achtung: Anfang und Ende der Calendar-CTE ist willkürlich!
Keine Ahnung ob man die dynamisch setzen kann
SQL:
SELECT
A1.mrID,
A1.Datum,
A1.mrNewFieldValue
FROM
(
WITH
RECURSIVE cnt(Datum) AS (SELECT Date('2010-01-01') As Datum UNION ALL SELECT Date(Datum,'+1 day') As Datum FROM cnt WHERE Datum<Date('2030-12-31')),
cte As (SELECT mrID, Date(Min(mrTimeStamp)) As MinStamp, Date(Max(mrTimeStamp)) As MaxStamp FROM tickets2 GROUP BY mrID)
SELECT
cte.mrID,
cnt.Datum,
(
SELECT T1.mrNewFieldValue
FROM tickets2 T1
WHERE
T1.mrID=cte.mrID AND
Date(T1.mrTimeStamp)<=cnt.Datum
ORDER BY T1.mrTimeStamp DESC LIMIT 1) As mrNewFieldValue

FROM
cte
LEFT OUTER JOIN
cnt
ON
cnt.Datum BETWEEN cte.MinStamp AND cte.MaxStamp) As A1
WHERE
A1.mrID=401057 AND
Date(A1.Datum)=Date(A1.Datum,'start of month')
 

Zvoni

Erfahrenes Mitglied
Hallo Zvoni, alter Schwede herzlichen Dank schon mal. Ich probiere das aus und melde mich wieder!
Danke!
Wie gesagt: In Ermangelung eines MSSQL-Servers hier, hab ich das alles in SQLite gemacht.
Musst nur rausfinden, wie es in MSSQL heisst (und ich tippe vor allem auf das "Date"-Zeug, was in MSSQL anderst sein dürfte).
Ich weiss dass das "LIMIT 1" in MSSQL irgendwie "SELECT TOP(1)" oder so heisst
 

brauh

Mitglied
Sorry muss noch mal in Ruhe mir das anschauen, deshalb habe ich den letzten Post rausgenommen.
 
Zuletzt bearbeitet:

brauh

Mitglied
Hallo Zvoni, ich muss gestehen mit dem Übersetzen tue ich mich etwas schwer. Mit der Calendar-Table bekomme ich eine Fehlermeldung., die darauf hinweist das ich keine Schreibrechte haben. Ich denke der Letzte Code ist dann das was ich bräuchte aber da blick ich noch nicht so richtig durch :) Ich muss da noch mehr ausprobieren mit dem Übersetzen. Ich melde mich wieder. Dennoch schon mal ganz herzlichen Dank.
 

brauh

Mitglied
Hallo Zvoni, ich hätte noch einmal ein Bitte. Wäre es möglich das du so eine Tabelle zauberst?

1616082721413.png

ich würde mich da sicher wesentlich leichter tun beim Übersetzen und evl. ist das auch performanter und wie im letzten code muss ich ohne Create Table oder Ähnliches zurecht kommen da ich keine Schreibrechte auf die Datenbank habe.

Die Idee ist, MinStamp und MaxStamp zu erstellen (hast du ja schon) und dann 3 zusätzliche Spalten anlegen für den jetzigen Monat, einen Monat zurück und zwei Monate zurück. Darin sollen dann die jeweils gültigen Zeitstempel vom 01. des Monats erzeugt werden in Abhängigkeit vom Zeitbereich MinStamp und MaxStamp.

Das wäre echt super! Eine CSV Datei habe ich ebenfalls angehängt.

Tausend Dank :) !
VG
Burghard
 

Anhänge

  • Tickets Beispiel V3.csv
    272 Bytes · Aufrufe: 0

Zvoni

Erfahrenes Mitglied
Wozu? In meiner letzten Variante brauchst du kein Create Table, weil die CTE on the fly eine temp. View erzeugt.
Für MSSQL sind glaube ich zwei Teile betroffen, die zu übersetzen sind: Das Date-Zeug, und das LIMIT
Ich versuchs mal (ungetestet):
SQL:
SELECT
    A1.mrID,
    A1.Datum,
    A1.mrNewFieldValue
    FROM
    (
    WITH
        RECURSIVE cnt(Datum) AS (SELECT Date('2010-01-01') As Datum UNION ALL SELECT DATEADD(day,1,Datum) As Datum FROM cnt WHERE Datum<Date('2030-12-31')),
        cte As (SELECT mrID, Date(Min(mrTimeStamp)) As MinStamp, Date(Max(mrTimeStamp)) As MaxStamp FROM tickets2 GROUP BY mrID)
        SELECT
        cte.mrID,
        cnt.Datum,
        (
            SELECT TOP(1) T1.mrNewFieldValue
            FROM tickets2 T1
            WHERE
            T1.mrID=cte.mrID AND
            Date(T1.mrTimeStamp)<=cnt.Datum
            ORDER BY T1.mrTimeStamp DESC) As mrNewFieldValue

            FROM
            cte
            LEFT OUTER JOIN
            cnt
            ON
            cnt.Datum BETWEEN cte.MinStamp AND cte.MaxStamp) As A1
WHERE
DATEPART(day.Datum)=1
Keine Ahnung, ob noch das "Date('2010-01-01') konvertiert werden muss.
 
Zuletzt bearbeitet: