Sql server SQL-从用户表查询日志
基于以下示例:它是一个QueryLog表,该表存储用户与两个不同产品N和R之间的交互: 预期成果: 只有UserID 250在我的条件内 如果一个用户在一个月内与产品交互10次,他就不在我的标准之内 要继续,我正在寻找: 至少一个月内与产品N进行交互的不同用户数,此用户在一个月内可能进行的交互数 这是我尝试过的代码:Sql server SQL-从用户表查询日志,sql-server,count,distinct,Sql Server,Count,Distinct,基于以下示例:它是一个QueryLog表,该表存储用户与两个不同产品N和R之间的交互: 预期成果: 只有UserID 250在我的条件内 如果一个用户在一个月内与产品交互10次,他就不在我的标准之内 要继续,我正在寻找: 至少一个月内与产品N进行交互的不同用户数,此用户在一个月内可能进行的交互数 这是我尝试过的代码: select distinct v.UserID, v.mois , v.annee from (select c.UserID , c. mois, c.annee, COUN
select distinct v.UserID, v.mois , v.annee
from
(select c.UserID , c. mois, c.annee, COUNT(c.UserID) as frequence
from
(
SELECT
datepart(month,[DATE]) as mois,
datepart(YEAR,[DATE]) as annee ,
Username,
UserID,
Product
FROM QueryLog
where Product = 'N'
) c
group by c.UserID, c.annee, c.mois
) v
group by v.UserID, v.mois, v.annee
试试这个:
DECLARE @YourTable table (Id int, [Date] datetime, UserID int, Product char(1))
INSERT INTO @YourTable VALUES (0,'2013-06-09 14:50:24',100 ,'N')
,(1,'2013-06-09 15:27:23',100 ,'N')
,(2,'2013-06-09 15:29:23',100 ,'N')
,(3,'2013-06-17 15:31:23',100 ,'N')
,(4,'2013-06-17 15:32:23',100 ,'N')
,(5,'2014-05-19 15:30:23',250 ,'N')
,(6,'2014-07-19 15:27:23',250 ,'N')
,(7,'2014-07-19 15:27:23',333 ,'R')
,(8,'2014-08-19 15:27:23',333 ,'R')
;WITH MultiMonthUsers AS
(
select
UserID
FROM (select
UserID
FROM @YourTable
WHERE product='N'
GROUP BY UserID, YEAR([Date]),MONTH([Date])
)dt2
GROUP BY UserID
HAVING COUNT(*)>1
)
SELECT COUNT(*) FROM MultiMonthUsers
根据行和索引的数量,这将运行缓慢。使用年[日期],月[日期]将防止任何索引使用。我认为这样做可以,但我需要一个更好的数据集来测试:
SELECT COUNT(*)
FROM (
--roll all month/user records into single row
SELECT UserID, datediff(month 0, [date]) As MonthGroup
FROM QueryLog
WHERE Product='N'
GROUP BY datediff(month 0, [date]), UserId
) t
-- look for users with multiple rows
GROUP BY UserID
HAVING COUNT(UserID) > 1
似乎应该有一种方法可以进一步汇总,以避免使用嵌套的select。将varchar转换为日期时间创建了一个越界值:sI尝试了其他方法:选择c.用户名,从select distinct Username开始计数,DATEPARTMONTH,日期为MOI,DATEPARTYEAR,日期为QueryLog中的annee,其中Product='N'c GROUP BY Username拥有COUNT>1 order BY Username我终于找到了解决方案。这个请求在我的情况下有效。谢谢你抽出时间。
DECLARE @YourTable table (Id int, [Date] datetime, UserID int, Product char(1))
INSERT INTO @YourTable VALUES (0,'2013-06-09 14:50:24',100 ,'N')
,(1,'2013-06-09 15:27:23',100 ,'N')
,(2,'2013-06-09 15:29:23',100 ,'N')
,(3,'2013-06-17 15:31:23',100 ,'N')
,(4,'2013-06-17 15:32:23',100 ,'N')
,(5,'2014-05-19 15:30:23',250 ,'N')
,(6,'2014-07-19 15:27:23',250 ,'N')
,(7,'2014-07-19 15:27:23',333 ,'R')
,(8,'2014-08-19 15:27:23',333 ,'R')
;WITH MultiMonthUsers AS
(
select
UserID
FROM (select
UserID
FROM @YourTable
WHERE product='N'
GROUP BY UserID, YEAR([Date]),MONTH([Date])
)dt2
GROUP BY UserID
HAVING COUNT(*)>1
)
SELECT COUNT(*) FROM MultiMonthUsers
SELECT COUNT(*)
FROM (
--roll all month/user records into single row
SELECT UserID, datediff(month 0, [date]) As MonthGroup
FROM QueryLog
WHERE Product='N'
GROUP BY datediff(month 0, [date]), UserId
) t
-- look for users with multiple rows
GROUP BY UserID
HAVING COUNT(UserID) > 1