webForumDet fria alternativet

MS SQL distinct select med order by

2 svar · 627 visningar · startad av mo:d:fi

mo:d:fiMedlem sedan jan. 200475 inlägg
#1

Hej!

Sitter och klurar lite på ett problem som jag inte lyckats lösa än.
Jag har två tabell där den ena inehåller login information samt en användartabell. Jag vill nu hämta de sensate 10 unika inloggningarna men lyckas inte få till det på ett bra sätt. så här har jag försökt hittills:

SELECT 	u.userNumber, u.userFirstname, u.userLastname, l.loginTime
	FROM	dbo.logins as l, dbo.users as u
	WHERE	l.UserID = u.UserID
	AND		u.UserID IN
	(SELECT DISTINCT TOP (10) UserID
	FROM	dbo.logins)
	AND		l.loginID = (SELECT TOP (1) loginID FROM dbo.logins WHERE UserID=u.UserID ORDER BY loginID DESC)
	ORDER BY loginID DESC

problemet är att det inte blir de 10 senaste inloggningarna då jag behöver sortera ut loginID i fallande ordning men stigande ordning är default. så jag skulle vilja skriva:

SELECT 	u.userNumber, u.userFirstname, u.userLastname, l.loginTime
	FROM	dbo.logins as l, dbo.users as u
	WHERE	l.UserID = u.UserID
	AND		u.UserID IN
	(SELECT DISTINCT TOP (10) UserID
	FROM	dbo.logins
	ORDER BY loginID)
	AND		l.loginID = (SELECT TOP (1) loginID FROM dbo.logins WHERE UserID=u.UserID ORDER BY loginID DESC)
	ORDER BY loginID DESC

Men eftersom jag använder distinct så säger databsen ifrån när jag ska spara SP'n då jag måste ha loginID i select satsen om jag ska få sortera på det när jag kör distinct.

Är det någon som har någon snygg, enkel och elegant lösning? Själv har jag gått bet och den kan nog inte bli mer prestandakrävande än vad min nu felaktiga sats är så.
Resultatet skall vara de tio senaste unika inloggningarna, det unika måste ligga på UserID självt eftersom om man kör på DISTINCT UserID, loginID så får man dubletter av användare eftersom kombinationen UserID & loginID är unik.
MS SQL 2005 är det som gäller är nog bra att nämna oxå.

Andreas

LarsGMedlem sedan dec. 200012 464 inlägg
#2
SELECT top 10 u.userNumber, u.userFirstname, u.userLastname, max(l.loginTime) lastLogin
  FROM dbo.logins as l join dbo.users as u
    on l.UserID = u.UserID
 group by u.userNumber, u.userFirstname, u.userLastname
  order by lastLogin desc
mo:d:fiMedlem sedan jan. 200475 inlägg
#3

Man bugar och bockar. det var en väldigt snygg och elegant lösning.

Vågar man besvära med en sql fråga till som jag hittills gått bet på.

Det handlar om ett närvaro system där man har en användartabell, en kursdeltagar tabell, en frånvaro tabell, en giltig frånvarotabell som innehåller UserID start- och slutdatum samt en notis tabell.
Sökningen skall ge alla användare knutna till en viss kurs i kursdeltagartabellen och deras frånvaro under en viss lektion som skall kastas med en CASE sats till antingen 0 för frånvarande (användaren finns i frånvarotabellen som förutom UserID listar lektionsID) 1, för giltig frånvaro (användarens UserID finns i giltig frånvaro tabellen där dagens datum ligger mellan start och slutdatum) och 2
för närvaro (användaren finns ej i frånvarotabellen, ej giltig frånvarotabellen men eventuellt i närvarokommentartabellen). utöver detta så skall en närvaro kommentar skickas med varje användare som finns i den tabellen där användaren hittats eller så skall den vara null om användaren inte ligger i nån av de 3 från/närvaro tabellerna.

Anledning till den krångliga tabell uppbyggnaden upkom först när vi bara skulle ha en frånvarotabell där vi lagrade frånvarande personer. Eftersom frånvaron relativt närvaron beräknades vara mycket lägre skulle vi spara mycket plats och prestanda då 4-5 poster/användare/dag skulle sparas i tabellen och ligga där i 6-12 månader samt att sökningen mon denna tabell kommer vara relativt frekvent. Vi har även sammanställning av närvaron så att vissa sökningar kan göras mot endast en kolumn i en mindre tabell men i det aktuella fallet behövs deatljerad information om när/frånvaro under en viss lektion och i ett fall på alla lektioner i en given kurs.

Om någon ser någon smidigare lösning är vi väldigt lyhörda för nya förslag. Kraven är prestanda samt att giltig frånvaro skall kunna registreras på en användare under en given period oberoende av kurs och lektioner. Närvaron och frånvaron skall även kunna ha en kommentar men kommer inte förekomma i alla fall. Därav var tanken att bara spara närvarotillfällen med kommentar i en tabell och inte de som inte ligger sparade någonstans anses vara full närvaro utan kommentar.

Andreas

131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)