ThomasSchoene
Neuer Benutzer
- Beiträge
- 4
Hallo Datenbankforum,
ich habe eine sql Frage und konnte bisher keine passende oder für mich übertragbare Antwort auf mein Problem finden.
Ich habe derzeit dieses (vermutlich einfache) SQL Problem (SQL Server 2014/2016):
Es geht um eine Aggregationsabfrage:
Stark vereinfacht dargestellt habe ich 2 Tabellen (Namenskonventionen, wie man perfekt Indexe setzt und so weiter - habe ich im Beispiel jetzt aussen vor gelassen - daran also bitte nicht stören falls da was auffallen sollte)
Tabelle tblMaschinen
Feld MaschinenID int (Primärschlüssel)
Feld Maschinenname varchar
Feld Maschinennummer varchar
Tabelle tblMaschinenLogin
Feld MaschinenLoginID int (Primärschlüssel)
Feld MaschinenID int (Fremdschlüssel)
Feld MaschinenloginVerbindungsname varchar
Feld MaschinenloginDatumUndZeit date
Tabelle tblMaschinen sind also Stammdaten, Tabelle tblMaschinenLogin sind Bewegungsdaten wo je login sich z.B. MaschinenloginVerbindungsname unterscheiden kann
Was ich darstellen will ist ein Abfrageergebnis
a) mit den Spalten:
Maschinenname
Maschinennummer
MaschinenloginDatumUndZeit
MaschinenloginVerbindungsname
Count(MaschinenLoginID) as AnzahlLogins
b) und dem Zeilenergebnis:
...für jede Maschine (auch die ohne logins) die Daten nur vom max(MaschinenloginDatumUndZeit) je MaschinenID und Anzahl er Logins der jeweiligen Maschine
(Anmerkung: MaschinenloginVerbindungsname ist zum Teil eine technische, neu generierte Zeichenfolge die ich deshalb hier im Beispiel nicht normalisiert)
Oder anders formuliert möchte ich alle Maschinen mit deren Detaildaten und als weitere Spalten alle Detaildaten der Maschine zum letzten Login plus die Anzahl der Logins der Maschine.
Test:
CREATE TABLE [dbo].[tblMaschinen](
[MaschinenID] [int] NOT NULL,
[Maschinenname] [varchar](50) NOT NULL,
[Maschinennummer] [varchar](20) NULL,
CONSTRAINT [PK_tblMaschinen] PRIMARY KEY CLUSTERED ( [MaschinenID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[tblMaschinenLogin](
[MaschinenLoginID] [int] NOT NULL,
[MaschinenID] [int] NOT NULL,
[MaschinenloginVerbindungsname] [varchar](20) NOT NULL, [MaschinenloginDatumUndZeit] [datetime] NOT NULL, CONSTRAINT [PK_tblMaschinenLogin] PRIMARY KEY CLUSTERED ( [MaschinenLoginID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [dbo].[tblMaschinen]([MaschinenID],[Maschinenname],[Maschinennummer]) VALUES(1, 'Maschine1', '123') INSERT INTO [dbo].[tblMaschinen]([MaschinenID],[Maschinenname],[Maschinennummer]) VALUES(2, 'Maschine2', '456') INSERT INTO [dbo].[tblMaschinen]([MaschinenID],[Maschinenname],[Maschinennummer]) VALUES(3, 'Maschine3', '789')
INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(1, 1, 'V1-abc', '01.01.2020 13:50') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(2, 1, 'V1-8546', '08.01.2020 11:50') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(3, 3, 'V6-pera', '05.01.2020 11:20') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(4, 3, 'V6-parx', '07.01.2020 13:20') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(5, 3, 'V2-463s', '08.01.2020 00:20') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(6, 3, 'V6-parx', '08.01.2020 11:50')
Die relevanten Datensätze sind hier also: MaschinenLoginID 2, 6 - da sie das je jüngste Login Datum je Maschine darstellen und deren IDs sind.
Mit meinem bisherigen Können (oder Nicht-Können )würde ich es über einen subselect versuchen der auf die MaschinenLoginID 2, 6 "filtert", aber der subselect muss ja auf die MaschinenloginDatumUndZeit und MaschinenID gruppieren und dann aber die MaschinenLoginID zurückgeben...
...oder vermutlich komme ich nicht auf den richtigen Ansatz wo ich hoffe das ihr mir auf die Sprünge helfen könnt.
Grüße Thomas Schöne
ich habe eine sql Frage und konnte bisher keine passende oder für mich übertragbare Antwort auf mein Problem finden.
Ich habe derzeit dieses (vermutlich einfache) SQL Problem (SQL Server 2014/2016):
Es geht um eine Aggregationsabfrage:
Stark vereinfacht dargestellt habe ich 2 Tabellen (Namenskonventionen, wie man perfekt Indexe setzt und so weiter - habe ich im Beispiel jetzt aussen vor gelassen - daran also bitte nicht stören falls da was auffallen sollte)
Tabelle tblMaschinen
Feld MaschinenID int (Primärschlüssel)
Feld Maschinenname varchar
Feld Maschinennummer varchar
Tabelle tblMaschinenLogin
Feld MaschinenLoginID int (Primärschlüssel)
Feld MaschinenID int (Fremdschlüssel)
Feld MaschinenloginVerbindungsname varchar
Feld MaschinenloginDatumUndZeit date
Tabelle tblMaschinen sind also Stammdaten, Tabelle tblMaschinenLogin sind Bewegungsdaten wo je login sich z.B. MaschinenloginVerbindungsname unterscheiden kann
Was ich darstellen will ist ein Abfrageergebnis
a) mit den Spalten:
Maschinenname
Maschinennummer
MaschinenloginDatumUndZeit
MaschinenloginVerbindungsname
Count(MaschinenLoginID) as AnzahlLogins
b) und dem Zeilenergebnis:
...für jede Maschine (auch die ohne logins) die Daten nur vom max(MaschinenloginDatumUndZeit) je MaschinenID und Anzahl er Logins der jeweiligen Maschine
(Anmerkung: MaschinenloginVerbindungsname ist zum Teil eine technische, neu generierte Zeichenfolge die ich deshalb hier im Beispiel nicht normalisiert)
Oder anders formuliert möchte ich alle Maschinen mit deren Detaildaten und als weitere Spalten alle Detaildaten der Maschine zum letzten Login plus die Anzahl der Logins der Maschine.
Test:
CREATE TABLE [dbo].[tblMaschinen](
[MaschinenID] [int] NOT NULL,
[Maschinenname] [varchar](50) NOT NULL,
[Maschinennummer] [varchar](20) NULL,
CONSTRAINT [PK_tblMaschinen] PRIMARY KEY CLUSTERED ( [MaschinenID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[tblMaschinenLogin](
[MaschinenLoginID] [int] NOT NULL,
[MaschinenID] [int] NOT NULL,
[MaschinenloginVerbindungsname] [varchar](20) NOT NULL, [MaschinenloginDatumUndZeit] [datetime] NOT NULL, CONSTRAINT [PK_tblMaschinenLogin] PRIMARY KEY CLUSTERED ( [MaschinenLoginID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [dbo].[tblMaschinen]([MaschinenID],[Maschinenname],[Maschinennummer]) VALUES(1, 'Maschine1', '123') INSERT INTO [dbo].[tblMaschinen]([MaschinenID],[Maschinenname],[Maschinennummer]) VALUES(2, 'Maschine2', '456') INSERT INTO [dbo].[tblMaschinen]([MaschinenID],[Maschinenname],[Maschinennummer]) VALUES(3, 'Maschine3', '789')
INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(1, 1, 'V1-abc', '01.01.2020 13:50') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(2, 1, 'V1-8546', '08.01.2020 11:50') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(3, 3, 'V6-pera', '05.01.2020 11:20') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(4, 3, 'V6-parx', '07.01.2020 13:20') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(5, 3, 'V2-463s', '08.01.2020 00:20') INSERT INTO [dbo].[tblMaschinenLogin]([MaschinenLoginID],[MaschinenID],[MaschinenloginVerbindungsname],[MaschinenloginDatumUndZeit]) VALUES(6, 3, 'V6-parx', '08.01.2020 11:50')
Die relevanten Datensätze sind hier also: MaschinenLoginID 2, 6 - da sie das je jüngste Login Datum je Maschine darstellen und deren IDs sind.
Mit meinem bisherigen Können (oder Nicht-Können )würde ich es über einen subselect versuchen der auf die MaschinenLoginID 2, 6 "filtert", aber der subselect muss ja auf die MaschinenloginDatumUndZeit und MaschinenID gruppieren und dann aber die MaschinenLoginID zurückgeben...
...oder vermutlich komme ich nicht auf den richtigen Ansatz wo ich hoffe das ihr mir auf die Sprünge helfen könnt.
Grüße Thomas Schöne