2017-08-23 6 views
0

に私はこれを試してみました -私はコミュニケーションの数を取得したいが、その前の週、その後毎週のログインなどのSQL

declare @maxD datetime 
select @maxD= max(loggingdate) FROM CommunicationLogs 

SELECT Count(loggingdate),@maxD FROM CommunicationLogs 
WHERE loggingdate BETWEEN (@maxD - 6) AND @maxD and clientid ='20154' 

4 2017-08-21 11:18:24.930 

上記の出力は、通信は2017年8月21日午前11時18分前にログインを意味します。 24.930とその7日前は4です。しかし、問題はその最大日付に特有です。私はすべてのログに記録された日付と同じ結果を得たいと思っています。

私は、SQLデータがあるしようとしたが、間違ったデータ -

SELECT COUNT(id),loggingdate FROM CommunicationLogs 
WHERE loggingdate BETWEEN (loggingdate - 6) AND loggingdate and clientid ='20154' 
group by loggingdate 
ORDER BY loggingdate desc 

を与える -

31935 2017-08-21 11:18:24.930 
31936 2017-08-21 00:00:00.000 
31933 2017-08-18 14:53:03.707 
31934 2017-08-18 00:00:00.000 
31924 2017-08-10 12:06:00.397 
31918 2017-07-26 00:00:00.000 
31919 2017-07-26 00:00:00.000 
31920 2017-07-26 00:00:00.000 
31921 2017-07-26 00:00:00.000 
31922 2017-07-26 00:00:00.000 
31923 2017-07-26 00:00:00.000 
31898 2017-07-25 00:00:00.000 
31899 2017-07-25 00:00:00.000 
31900 2017-07-25 00:00:00.000 
31901 2017-07-25 00:00:00.000 
31902 2017-07-25 00:00:00.000 
31903 2017-07-25 00:00:00.000 
31904 2017-07-25 00:00:00.000 
31905 2017-07-25 00:00:00.000 
31906 2017-07-25 00:00:00.000 
31907 2017-07-25 00:00:00.000 
31908 2017-07-25 00:00:00.000 
31909 2017-07-25 00:00:00.000 
31910 2017-07-25 00:00:00.000 
31911 2017-07-25 00:00:00.000 
31912 2017-07-25 00:00:00.000 
31913 2017-07-25 00:00:00.000 
31914 2017-07-25 00:00:00.000 
31915 2017-07-25 00:00:00.000 
31916 2017-07-25 00:00:00.000 
31917 2017-07-25 00:00:00.000 
31889 2017-07-24 00:00:00.000 
31890 2017-07-24 00:00:00.000 
+0

の最大日付に依存します"あなたはあなたの現在の質問から得ています、そして、代わりに"正しいデータ "は何でしょうか? –

答えて

0

、これを試してみてください、それが役に立てば幸いかとアイデアを与えます。

SQL Server 2005の

ロギングデータを毎週取得--to最大日付に依存

select Count(loggingDate),max(loggingDate) from (select CommunicationLogs.id,CommunicationLogs.loggingDate,cast(DATEDIFF(day,loggingDate,maxLoggingDate)/7 as int)WeekGroup from CommunicationLogs 
cross apply (select max(loggingDate) maxLoggingDate from CommunicationLogs)maxData)weekGroupData 
group by WeekGroup 

ロギングデータを毎週取得--to各ID

の最大日付に依存
select id,Count(*),max(loggingDate) from 
(select CommunicationLogs.id,CommunicationLogs.loggingDate,cast(DATEDIFF(day,loggingDate,maxLoggingDate)/7 as int)WeekGroup from CommunicationLogs 
    left join (select id,max(loggingDate) maxLoggingDate from CommunicationLogs group by id) maxData 
    on maxData.id=CommunicationLogs.id 
)weekGroupData 
group by id,WeekGroup 

SQL Server 2008+あなたはCTE節を使用して読みやすくすることができます

ロギングデータを毎週取得--toがロギングデータを毎週取得--to最大日

with maxData as 
(
select max(loggingDate) maxLoggingDate from CommunicationLogs 
), 
weekGroupData as(
select CommunicationLogs.id,CommunicationLogs.loggingDate,cast(DATEDIFF(day,loggingDate,maxLoggingDate)/7 as int)WeekGroup from CommunicationLogs 
cross apply maxData 
) 
select Count(loggingDate),max(loggingDate) from weekGroupData 
group by WeekGroup 

に依存することは、「間違ったデータで何各ID

with maxData as 
(
select id, max(loggingDate) maxLoggingDate from CommunicationLogs 
group by id 
), 
weekGroupData as(
select CommunicationLogs.id,CommunicationLogs.loggingDate,cast(DATEDIFF(day,loggingDate,maxLoggingDate)/7 as int)WeekGroup from CommunicationLogs 
left join maxData on maxData.id=CommunicationLogs.id 
) 
select id,Count(*),max(loggingDate) from weekGroupData 
group by id,WeekGroup 
関連する問題