SELECT
TabellID,
UserID,
MAX(Value)
FROM
tbl
GROUP BY
UserID
Borde göra susen?
Annars kan du testa
SELECT
TabellID,
DISTINCT(UserID),
Value
FROM
tbl
GROUP BY
Value
Order By
Value
13 svar · 749 visningar · startad av inspiro
Hej! Jag har följande tabell:
------------------------
TabellID | UserID | Value
1 1 10
2 2 20
3 1 40
4 3 15
5 1 60
6 2 30
Nu önskar jag hämta ut varje användares högsta värde och det kan man ju förstås göra med MAX(Value). Problemet är att jag också måste få tag på TabellID och använder man MAX så måste man ju gruppera och då fungerar det inte? Vill alltså få fram följande ur datat ovan:
------------------------
TabellID | UserID | Value
4 3 15
5 1 60
6 2 30
Kör sql server 2005.
SELECT
TabellID,
UserID,
MAX(Value)
FROM
tbl
GROUP BY
UserID
Borde göra susen?
Annars kan du testa
SELECT
TabellID,
DISTINCT(UserID),
Value
FROM
tbl
GROUP BY
Value
Order By
Value
Hej och tack för svar. Nej, det är det som inte funkar... jag kan inte ha med TabellID om jag inte samtidigt har med tabellid i group by. Men eftersom tabellid är unikt så kommer ju varje tabellid att bli en grupp istället för userid!
select TabellID,
UserID,
Value
from tbl as t
where value =
(select max(value)
from tbl
where tbl.userid = t.userid)
Jag fortsätter experimentera lite.
SELECT
TabellID,
UserID,
Value
FROM
tbl t1
WHERE
Value = (
SELECT
MAX(Value)
FROM
tbl t2
WHERE
t2.UserID = t1.UserID
)
/r doh, LarsG hann före.
Toppen, tackar! En följdfråga dock, om samma användare har två exakt samma värden så kommer båda med, går det att bara få med sig ett av dem (exempelvis med hjälp av senast datum som också finns i tabellen)?
Testa
SELECT
TabellID,
UserID,
Value
FROM
tbl t1
WHERE
Value = (
SELECT
MAX(Value)
FROM
tbl t2
WHERE
t2.UserID = t1.UserID
LIMIT
1
)
Nej, testa inte det. Limit fungerar ju inte i SQL Server. Dessutom hade det inte gett något resultat eftersom max ändå bara returnerar ett värde.
Räcker det inte med att köra SELECT DISTINCT?
Nej, testa inte det. Limit fungerar ju inte i SQL Server. Dessutom hade det inte gett något resultat eftersom max ändå bara returnerar ett värde.
Räcker det inte med att köra SELECT DISTINCT?
Visste jag inte, tack. :)
Borde det inte funka med GROUP BY UserID?
Visste jag inte, tack. :)
Borde det inte funka med GROUP BY UserID?
Nej, du måste gruppera på alla fält som inte är beräknade.
Räcker det inte med att köra SELECT DISTINCT?
Nej, distinct fungerar inte eftersom det kan vara unika poster - samma userid och value men olika tabellid (och olika datum från ett datumfält som också finns i tabellen, när datumet gått ut kan man nämligen lägga in en ny post med samma värde).
Ok, jag fattade nog inte riktigt hur det hängde ihop. Sorry.
select TabellID,
UserID,
Value
from tbl as t
where value =
(select max(value)
from tbl
where tbl.userid = t.userid)
and <datum> =
(select max(<datum>)
from tbl
where tbl.userid = t.userid)
Toppen, tack! Fungerar perfekt! :D Hittade även ett alternativt sätt med join som om jag förstod det rätt ska vara lite snabbare än en sub query. Principen .r denna:
select f.type, f.variety, f.price
from (
select type, min(price) as minprice
from fruits group by type
) as x inner join fruits as f on f.type = x.type and f.price = x.minprice;
Länk: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/