Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-从用户表查询日志_Sql Server_Count_Distinct - Fatal编程技术网

Sql server SQL-从用户表查询日志

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

基于以下示例:它是一个QueryLog表,该表存储用户与两个不同产品N和R之间的交互:

预期成果: 只有UserID 250在我的条件内

如果一个用户在一个月内与产品交互10次,他就不在我的标准之内

要继续,我正在寻找: 至少一个月内与产品N进行交互的不同用户数,此用户在一个月内可能进行的交互数

这是我尝试过的代码:

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