2012-03-16 3 views
0

Это прекрасный маленький SQL, который я не могу писать. :)sql unique и join

что мне нужно сделать это;

выберите последнее значение из таблицы (CreatedOn) для каждого пользователя для определенного StatID. Мне нужно затем присоединиться к usertable (ssUSER) и выбрать u.username, и мне также необходимо присоединиться к detailstatid из таблицы. То есть Мне просто нужен последний результат из этой таблицы для каждого пользователя, а затем выполните соединение с пользователем и detailstatid.

SELECT TOP 1000 
    [DetailStatUserLogID] 
    ,[UserID] 
    ,[DetailStatID] 
    ,[OverviewID] 
    ,[Count] 
    ,[StatPercent] 
    ,[SpecificDate] 
    ,[CreatedOn] 
    ,[ModifiedOn] 
    ,[Note] 
    ,[LoggedDate] 
    ,[OverViewGUID] 
FROM [StartStop].[dbo].[DetailStatUserLog] 

SELECT TOP 1000 
    [DetailStatID] 
    ,[DetailStatGUID] 
    ,[NameOfStat] 
    ,[DetailOfStat] 
    ,[CreatedByType] 
    ,[DataType] 
    ,[CreatedByGUID] 
    ,[CreatedBy] 
    ,[ModifiedOn] 
    ,[CreatedOn] 
    ,[OverviewID] 
FROM [StartStop].[dbo].[DetailStat] 

SELECT TOP 1000 
    [UserID] 
    ,[EmailAddress] 
    ,[Authenticated] 
    ,[UserName] 
FROM [StartStop].[dbo].[ssUsers] 

Спасибо за любую помощь вы могли бы быть в состоянии дать. :)

+1

Не могли бы вы опубликовать свои структуры таблицы или создать скрипку с таблицами добавленными? –

ответ

2

Try:

select /* entered desired fields here */ 
from (select l.*, 
      row_number() over (partition by [UserID], [DetailStatID] 
           order by [CreatedOn] desc) rn 
     from DetailStatUserLog l) ll 
join ssUsers u on ll.[UserId] = u.[UserId] 
Join DetailStat s on ll.[DetailStatId] = s.[DetailStatId] 
where ll.rn=1 
+0

@philbird: по сравнению с коррелированными подзапросами он должен быть значительно более эффективным - аналитические функции относительно дороги с точки зрения обработки, но обычно намного меньше, чем множественные обращения к таблице. –

+0

Спасибо, Марк. Я пишу приложение статистики, поэтому я действительно должен лучше понять это. :) Я буду читать. – philbird

0

Я думаю, что это должно делать, вы хотите. Трудно протестировать без DDL или данных.

Select u.UserName, 
     ds.DetailedStat, 
     dsl.CreatedOn, 
     dsl.DetailStatId, 
     dsl.UserId 

From 
(
Select d.UserId, d.DetailStatId, Max(d.CreatedOn) as [CreatedOn] 
From DetailStatUserLog d 
Where d.CreatedOn = (Select Max(CreatedON) 
        From DetailStatUserLog 
        Where UserID = d.UserId 
        And DetailStatId = d.DetailStatId 
        ) 
Group By d.UserId, d.DetailStatId 

)dsl 
Join ssUsers u on dsl.UserId = u.UserId 
Join detailstat ds on dsl.DetailStatId = ds.DetailStatId 
+0

Спасибо, что поп в нем Барри. :) Это говорит мне: агрегат может не отображаться в предложении WHERE, если он не находится в подзапросе, содержащемся в предложении HAVING или списке выбора, а агрегированный столбец является внешней ссылкой. – philbird

+0

@philbird: Я пропустил предложение 'From', которое я добавил. Какая линия заключается в том, что, поскольку это отлично работает для меня. Вы что-то добавили? – codingbadger