Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/05/2011, 09h35   #1
Membre à l'essai
 
Nicolas DELFOUR
Développeur Web
Inscription : novembre 2009
Messages : 56
Détails du profil
Informations personnelles :
Nom : Nicolas DELFOUR
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2009
Messages : 56
Points : 23
Points : 23
Par défaut Requete avec groupement par interval de date

Bonjour à tous,
Je suis en train de créer un filtre qui doit me permettre de choisir des images classer par le nombre de vue mais regroupées par interval de temps.
Exemple:
voir les images les + vues des dernières 24h
voir les images les + vues depuis 3 jours
... depuis 1 semaine

j'aimerai avec la requête sélectionner toutes les images et après les regrouper par interval de temps classées par nombre de vue.

Voici la structure de la table
ImageId pk
Name
size
numberSeen
dateSeen

j'avais fait une requête mais elle me retourne que les images des dernières 24h -3j ou 1semaine

Merci d'avance.
dublow est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h03   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Un peu de fun avec une CTE récursive (SQL Server 2005 et 2008) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;WITH
	CTE AS
	(
			SELECT	0 AS hour_start
				, 24 AS hour_end
				, 1 AS nb_jour
		UNION ALL
			SELECT	hour_start + 24
				, hour_end + 24
				, nb_jour + 1
			FROM	CTE
			WHERE	nb_jour < 7
	)
SELECT		C.nb_jour
		, T.ImageId
		, SUM(T.numberSeen) AS totalSeen
FROM		CTE AS C
INNER JOIN	dbo.maTable AS T 
			ON DATEDIFF(hour, dateSeen, GETDATE()) >= C.hour_start
			AND DATEDIFF(hour, dateSeen, GETDATE()) < C.hour_end
GROUP BY	C.nb_jour
		, T.ImageId
Ou encore :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;WITH
	CTE_JOUR (hour_start, hour_end, nb_jour) AS
	(
		SELECT 0, 24, 1
		UNION ALL SELECT 24, 48, 2
		UNION ALL SELECT 48, 72, 3
		UNION ALL SELECT 72, 96, 4
		UNION ALL SELECT 96, 120, 5
		UNION ALL SELECT 120, 144, 6
		UNION ALL SELECT 144, 168, 7
	)
SELECT		C.nb_jour
		, T.ImageId
		, SUM(T.numberSeen) AS totalSeen
FROM		CTE_JOUR AS C
INNER JOIN	dbo.maTable AS T 
			ON DATEDIFF(hour, dateSeen, GETDATE()) >= C.hour_start
			AND DATEDIFF(hour, dateSeen, GETDATE()) < C.hour_end
GROUP BY	C.nb_jour
		, T.ImageId
Ou encore (surtout si vous êtes sous SQL Server 2000) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT		C.nb_jour
		, T.ImageId
		, SUM(T.numberSeen) AS totalSeen
FROM		(
			SELECT 0, 24, 1
			UNION ALL SELECT 24, 48, 2
			UNION ALL SELECT 48, 72, 3
			UNION ALL SELECT 72, 96, 4
			UNION ALL SELECT 96, 120, 5
			UNION ALL SELECT 120, 144, 6
			UNION ALL SELECT 144, 168, 7
		) AS C (hour_start, hour_end, nb_jour)
INNER JOIN	dbo.maTable AS T 
			ON DATEDIFF(hour, dateSeen, GETDATE()) >= C.hour_start
			AND DATEDIFF(hour, dateSeen, GETDATE()) < C.hour_end
GROUP BY	C.nb_jour
		, T.ImageId
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/05/2011, 12h23   #3
Membre à l'essai
 
Nicolas DELFOUR
Développeur Web
Inscription : novembre 2009
Messages : 56
Détails du profil
Informations personnelles :
Nom : Nicolas DELFOUR
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2009
Messages : 56
Points : 23
Points : 23
Merci pour les exemples, c'est super^^
Je vais tester de mon côté et le retranscrire en Icriteria Nhibernate

Je reviens mettre en résolu dés que j'ai le filtre fonctionnel.
dublow est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h23   #4
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Qu'est-ce que vous voulez dire par "regrouper des images" ?
Que vous faut-il exactement comme résultat (des sommes, des moyennes, ...) ?

S'il s'agit juste de les ordonner :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT <etc.>, MyOrder.Val
FROM <etc.>
CROSS APPLY (
 SELECT CASE
 WHEN MaDate > DATEADD(dd, -1, GETDATE()) THEN 1
 WHEN MaDate > DATEADD(dd, -3, GETDATE()) THEN 2
 ELSE 3
 END
) MyOrder(Val)
WHERE MaDate > DATEADD(dd, -7, GETDATE())
ORDER BY MyOrder.Val ASC, NombreDeVue DESC
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 21h01   #5
Membre à l'essai
 
Nicolas DELFOUR
Développeur Web
Inscription : novembre 2009
Messages : 56
Détails du profil
Informations personnelles :
Nom : Nicolas DELFOUR
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2009
Messages : 56
Points : 23
Points : 23
Merci pour les réponses, j'ai pu réaliser une proc stock (sql dynamique) et du coup tout fonctionne correctement.
dublow est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h38.


 
 
 
 
Partenaires

Hébergement Web