2009-11-05 6 views
-1

J'ai une requête:défi groupement SQL

select event_type, 
    department_name, 
    effective_time, 
    row_number() OVER (PARTITION BY event_type,department_name ORDER BY effective_time) row 
from a 
order by effective_time 

Il retourne un ensemble de lignes:

event_type department_name effective_time 
3 A 02/10/09 13:12:00 
3 B 02/10/09 15:44:00 
3 B 02/10/09 20:36:00 
7 C 04/01/09 00:01:00 
7 D 04/10/09 00:01:00 
7 D 04/20/09 00:01:00 
7 E 04/20/09 00:01:00 
7 F 04/23/09 09:32:00 
7 F 05/15/09 12:21:00 
7 G 05/15/09 12:21:00 
7 H 05/15/09 12:21:00 
1 H 07/28/09 08:51:00 
1 G 07/28/09 08:51:00 
1 F 07/28/09 10:40:00 
1 F 07/28/09 12:34:00 
1 H 07/28/09 12:34:00 
1 G 07/28/09 12:34:00 
1 D 07/29/09 10:45:00 
1 D 07/29/09 12:48:00 
1 G 07/31/09 13:47:00 
1 F 07/31/09 13:47:00 
1 D 08/03/09 00:01:00 
3 B 08/03/09 10:39:00 

je besoin de la ligne du jeu pour ressembler à:

event_type department_name effective_time 
3 A 02/10/09 13:12:00 
3 B 02/10/09 15:44:00 
7 C 04/01/09 00:01:00 
7 D 04/10/09 00:01:00 
7 E 04/20/09 00:01:00 
7 F 04/23/09 09:32:00 
7 G 05/15/09 12:21:00 
7 H 05/15/09 12:21:00 
1 H 07/28/09 08:51:00 
1 G 07/28/09 08:51:00 
1 F 07/28/09 10:40:00 
1 H 07/28/09 12:34:00 
1 G 07/28/09 12:34:00 
1 D 07/29/09 10:45:00 
1 G 07/31/09 13:47:00 
1 F 07/31/09 13:47:00 
1 D 08/03/09 00:01:00 
3 B 08/03/09 10:39:00 

Essentiellement, la suppression la deuxième (ou plus) occurrence d'un event_type et d'un department_name dans le groupe.

J'espérais utiliser le row_number pour résoudre ce problème, en éliminant toute la ligne #> 1.

Malheureusement, comme il est écrit, la fonction row_number() ne parvient pas à remettre le compteur de la ligne après un changement de event_type et Nom du département.

Questions:

  1. Peut-on régler le calcul de row_number()?
  2. Y a-t-il une autre approche qui fonctionnerait plus efficacement?
  3. Est-ce possible sans intervention programmatique (procédure stockée ou fonction UDF)?

Merci pour votre aide.

+0

Pourquoi quelqu'un a-t-il déprécié la question? Quel est le problème avec la question elle-même? – shahkalpesh

Répondre

2

droit, après avoir lu votre commentaire, je pense que je comprends. Une approche consisterait à numéroter les lignes d'une sous-requête en fonction d'une valeur effective_time. Avec les chiffres, il est facile de chercher la rangée précédente. Ensuite, vous pouvez filtrer les lignes "répéter" en disant que chaque ligne doit être différente de son prédécesseur.

Voici un exemple de requête:

;with numbered as (
    SELECT event_type, department_name, effective_time, 
      row_number() OVER (ORDER BY effective_time) row 
    FROM a 
) 
SELECT cur.event_type, cur.department_name, cur.effective_time 
FROM  numbered cur 
LEFT JOIN numbered prev ON cur.row = prev.row + 1 
WHERE  cur.row = 1 
      or prev.event_type <> cur.event_type 
      or prev.department_name <> cur.department_name 
ORDER BY cur.effective_time 

Par ailleurs, si vous voulez des réponses testées, afficher les exemples de données sous forme de texte et non comme une image jpg :)

+0

c'est vrai, mais j'ai toujours le problème avec le calcul row_number. – craig

+0

@Craig: Ok, je pense que je comprends mieux la question maintenant, édité. – Andomar

+0

* très * proche. malheureusement, la requête perd la première rangée (3, A, 02/10/09 13:12:00). – craig

0

Vous pouvez créer un groupe par event_type, department_name. La seule chose est la date que vous devrez ajouter à un agrégat comme min (date) ou le groupe par n'a pas de sens.

select event_type, 
    department_name, 
    convert(varchar, effective_time, 1) as date 

from a 
group by event_type, department_name, convert(varchar, effective_time, 1) 
order by effective_time 
+0

Ne fonctionne pas - cela me donne une liste * unique * des valeurs event_type/department_name. Si vous observez attentivement les résultats souhaités, la combinaison event_type/department_name peut se produire plusieurs fois, mais avec des heures différentes. – craig

+0

Que voulez-vous alors? – CSharpAtl

+0

qu'est-ce que le temps signifie alors? – CSharpAtl

2

Essayez ceci:

SELECT event_type, 
    department_name, 
    MIN(effective_time) 
FROM a 
GROUP BY event_type, 
    department_name 
ORDER BY effective_time 
+0

+1 Dang, pourquoi je n'ai pas pensé à ça :) – Andomar

+0

Non. Voir ma réponse à CSharpAtl pour la raison pourquoi. – craig

0
select event_type, 
    department_name, 
    min(effective_time) as effTime, 
from a 
group by event_type, department_name 
order by effective_time 

cette aide du tout?

+0

Non. Voir ma réponse à CSharpAtl pour la raison pourquoi. – craig