webForumDet fria alternativet

Hämta högsta värdena för respektive användare?

Databaser & SQL

13 svar · 749 visningar · startad av inspiro

Medlem sedan sep. 2005673 inlägg
Frågan#1

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.

Medlem sedan juli 20033 147 inlägg
#2
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
Medlem sedan sep. 2005673 inlägg
#3

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!

Medlem sedan dec. 200012 464 inlägg
#4
select TabellID,
        UserID,
        Value
  from tbl as t
 where value =
     (select max(value)
        from tbl
       where tbl.userid = t.userid)
Medlem sedan juli 20033 147 inlägg
#5

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.

Medlem sedan sep. 2005673 inlägg
#6

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)?

Medlem sedan juli 20033 147 inlägg
#7

Testa

SELECT
   TabellID,
   UserID,
   Value 
FROM
   tbl t1
WHERE
   Value = (
   SELECT
      MAX(Value)
   FROM
      tbl t2
   WHERE
      t2.UserID = t1.UserID
   LIMIT
      1
   )
Medlem sedan juni 200032 967 inlägg
#8

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?

Medlem sedan juli 20033 147 inlägg
#9

@nders skrev:

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?

Medlem sedan juni 200032 967 inlägg
#10

Melea skrev:

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.

Medlem sedan sep. 2005673 inlägg
#11

@nders skrev:

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).

Medlem sedan juni 200032 967 inlägg
#12

Ok, jag fattade nog inte riktigt hur det hängde ihop. Sorry.

Medlem sedan dec. 20025 483 inlägg
#13
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)
Medlem sedan sep. 2005673 inlägg
#14

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/

254 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)