2010-03-15 2 views
0

J'ai plusieurs tables:mieux notés, la plus ancienne piste

CREATE TABLE [dbo].[Tracks](
    [Id] [uniqueidentifier] NOT NULL, 
    [Artist_Id] [uniqueidentifier] NOT NULL, 
    [Album_Id] [uniqueidentifier] NOT NULL, 
    [Title] [nvarchar](255) NOT NULL, 
    [Length] [int] NOT NULL, 
CONSTRAINT [PK_Tracks_1] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [dbo].[TrackHistory](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Track_Id] [uniqueidentifier] NOT NULL, 
    [Datetime] [datetime] NOT NULL, 
CONSTRAINT [PK_TrackHistory] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


INSERT INTO [cooltunes].[dbo].[TrackHistory] 
      ([Track_Id] 
      ,[Datetime]) 
    VALUES 
      ("335294B0-735E-4E2C-8389-8326B17CE813" 
      ,GETDATE()) 



CREATE TABLE [dbo].[Ratings](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Track_Id] [uniqueidentifier] NOT NULL, 
    [User_Id] [uniqueidentifier] NOT NULL, 
    [Rating] [tinyint] NOT NULL, 
CONSTRAINT [PK_Ratings] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

INSERT INTO [cooltunes].[dbo].[Ratings] 
      ([Track_Id] 
      ,[User_Id] 
      ,[Rating]) 
    VALUES 
      ("335294B0-735E-4E2C-8389-8326B17CE813" 
      ,"C7D62450-8BE6-40F6-80F1-A539DA301772" 
      ,1) 


Users 
User_Id|Guid 
Other fields 

Liens entre les tables sont assez évidentes. TrackHistory ajoute chaque piste comme une rangée chaque fois qu'elle est jouée. une piste apparaîtra là-bas plusieurs fois.

La valeur des évaluations sera 1 ou -1. Ce que j'essaie de faire est de sélectionner la piste avec la meilleure note, c'est-à-dire more than 2 hours old, et s'il y a un doublon pour une piste (ie une piste reçoit 6 +1 notes et 1 - évaluation, ce qui donne suivre une note totale de 5, une autre piste a également une note totale de 5), la piste qui a été joué le plus longtemps doit être retourné. (Si toutes les pistes ont été jouées dans les 2 dernières heures, aucune ligne ne doivent être retournés)

Je reçois faire quelque part chaque partie individuellement en utilisant le lien ci-dessus, et SUM(Value)GROUP BY Track_Id, mais je vais avoir du mal à mettre tout ensemble.

J'espère que quelqu'un avec un peu plus de connaissances (MS) SQL sera en mesure de m'aider. Merci beaucoup!

+0

Peut-être que vous pouvez publier vos instructions SQL ou Créer une table avec des données d'insertion. – Sam

+0

"et s'il y a un doublon pour une piste (c.-à-d. 5 pour deux pistes ou plus), la piste qui a été jouée la dernière fois devrait être retournée." Cette section n'a pas de sens pour moi. D'où obtenez-vous 5? Les pistes ne devraient-elles pas être évaluées plus d'une fois? Qu'est-ce qu'un doublon? Dupliquer l'utilisateur et la piste peut-être? – Sam

+0

Désolé Sam, oui je prévoyais de. Je ne l'avais pas à ma disposition quand j'ai écrit la question. Pour votre deuxième question, je vais mettre à jour la question. –

Répondre

1
select top 1 t.Id, SUM(r.Rating) as Rating, MAX(Datetime) as LastPlayed 
from Tracks t 
inner join TrackHistory h on t.Id = h.Track_Id 
inner join Ratings r on t.Id = r.Track_Id 
where h.Track_Id not in (
    select Track_Id 
    from TrackHistory 
    where Datetime > DATEADD(HOUR, -2, getdate()) 
) 
group by t.Id 
order by Rating desc, LastPlayed 
+0

Merci pour cela. On dirait bien, ne peut pas encore le tester. Mais cela ne devrait-il pas être 'DATEADD (HOUR, -2, getdate())'? –

+0

Oui, je l'ai réparé. – RedFilter

Questions connexes