[SQLSERVER]group by

group by [SQLSERVER] - SQL/NoSQL - Programmation

Marsh Posté le 19-08-2010 à 15:53:51    

J'ai une table comme ça:
 
  select top 10 [visitor_id],[first_request],[interests] from [visitors]
  where interests is not null
  order by visitor_id desc
 

visitor_id first_request interests
zzzg9omfiaaed 2010-07-23 19:07:19.000 300000138;56;300000021;23;300000137;20
zzzg9omfiaaed 2010-07-22 21:51:56.000 300000138;52;300000021;25;300000137;22
zzyvhymufy329 2010-08-08 13:59:45.000 300000205;82;30011;17
zzxxw0ecvs0ts 2010-07-26 15:28:45.000 300000205;60;30011;39
zzxunqcwfcg0h 2010-08-09 06:47:49.000 30017;93;300000205;6;30011;0
zzxunqcwfcg0h 2010-08-10 03:18:52.000 30017;50;300000205;41;30011;8
zzxunqcwfcg0h 2010-08-09 08:48:31.000 30017;49;300000205;41;30011;8
zzxhudlptox6v 2010-08-18 15:29:07.000 30011;68;300000205;31
zzxhudlptox6v 2010-08-09 18:13:25.000 30011;59;300000205;40
zzxhudlptox6v 2010-08-09 19:19:07.000 30011;63;300000205;36


 
on remarque qu'il y a des duplicates dans les visitor_id
Il faut les grouper en fonction du first_request le plus grand (tard)
 
J'ai donc eu la merveilleuse idée de faire ceci:

Code :
  1. SELECT top 10
  2.  [visitor_id]
  3.  ,max([first_request]) AS fmax
  4.  ,interests
  5.  FROM [visitors]
  6.  WHERE interests IS NOT NULL
  7.  GROUP BY visitor_id
  8.  ORDER BY visitor_id DESC


Mais ça ne marche pas.
Dans la doc ils disent (enfin ce que je comprends) que tout ce qui est dans le select et qui n'est pas une fonction d'aggregation doit se retrouver dans le group by.
Wait, wat ?  [:corten]  
Ca veut dire que si j'ai 11 trucs dans le select et que je fais un MAX() sur un champ, les 10 autres doivent se retrouver dans le group by ??
 
Et si je fais cela:

Code :
  1. SELECT top 10
  2.  [visitor_id]
  3.  ,max([first_request]) AS fmax
  4.  ,interests
  5.  FROM [EVO5_PHILIPS].[dbo].[visitors]
  6.  WHERE interests IS NOT NULL
  7.  GROUP BY visitor_id,interests
  8.  ORDER BY visitor_id DESC


évidement c'est super lent et évidemment je me retrouve avec mes duplicates visitor_id [:pingouino]  
 
Je ne comprends rien

Reply

Marsh Posté le 19-08-2010 à 15:53:51   

Reply

Marsh Posté le 19-08-2010 à 16:28:14    

Si le server fait un group by visitor_id, il y a potentiellement plusieurs first_request et plusieurs interests par ligne retournée, il faut donc lui donner un moyen de choisir le quel (avec un aggregate).
 
Dans ton cas c'est un peu plus compliqué vu qu'il n'y a malheureusement pas moyen de lui demander de selectionner le record interests qui correspon au max(first_request), il faut ruser:

Code :
  1. SELECT a.*
  2. FROM [visitors] a
  3.     JOIN (
  4.         SELECT top 10
  5.             [visitor_id]
  6.             ,MAX([first_request]) AS fmax
  7.         FROM [visitors]
  8.         WHERE interests IS NOT NULL
  9.         GROUP BY visitor_id
  10.     ) b ON a.[visitor_id] = b.[visitor_id] AND a.[first_request] = b.fmax
  11. ORDER BY visitor_id DESC


Message édité par Oliiii le 19-08-2010 à 16:29:04
Reply

Marsh Posté le 19-08-2010 à 17:55:12    

Tu es extraordinaire  [:shimay:1]  
 
Merci !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed