让每日用户关注者计算SQL Server中过去7天的日期?

时间:2017-05-10 11:12:08

标签: sql sql-server

我正在创建一个查询,以获取(过去7天)SQL Server中每日用户关注者的数量。我写了这个查询,但它没有返回预期的输出。现在它返回计数,但它不是正确的数据。

这是我的疑问,请告诉我我的错误在哪里。我在数据库中有2个表,第1个是user,第2个是userfollowers

SELECT 
    CAST(DATEADD(DAY, T.i, GETDATE()) AS DATE) AS DateColumn, 
    uf.TotalCount 
FROM 
    (VALUES (0), (-1), (-2), (-3), (-4), (-5), (-6)) AS T(i)
OUTER APPLY 
    (SELECT 
         COUNT(UF.InsertDateTime) AS TotalCount
     FROM 
         userfollowers UF
     INNER JOIN 
         user U on U.UserId = UF.UserFollowerId
     WHERE 
         DATEDIFF(DAY, UF.InsertDateTime, DATEADD(DAY, T.i, GETDATE())) = 0 
         AND UF.IsFollowed = 1 
         AND U.IsMUser = 1 OR U.IsFUser = 1) uf

预期产出:

DateColumn | Count
10-05-2017     8
09-05-2017    05
08-05-2017    20
07-05-2017    10
06-05-2017    30
05-05-2017    50
04-05-2017    50

这是我数据库表中的示例数据:

 UFID | UserId | UserFolloresId | IsFollowres | InsertDateTime
 1       1110          100             1        2017-05-10 11:26:27.500
 2       1120          100             1        2017-05-10 11:26:27.500
 3       1130          100             1        2017-05-10 11:26:27.500 
 4       1200          100             1        2017-05-10 11:26:27.500
 5       1110          101             1        2017-05-10 11:26:27.500
 6       1120          101             1        2017-05-10 11:26:27.500
 7       1130          101             1        2017-05-10 11:26:27.500 
 8       1200          101             1        2017-05-10 11:26:27.500

这个数据显示这个查询我希望得到8个计数,但我得到0.所以我不知道我的错误在哪里,任何人都知道请告诉我。

2 个答案:

答案 0 :(得分:1)

我假设您希望<body onload="Slider();"> <div class="slider"> <img id="1" src="img/home/01.jpg" border="0" alt="omage" class="img-responsive"> <img id="2" src="img/home/02.jpg" border="0" alt="omage" class="img-responsive"> <img id="3" src="img/home/03.jpg" border="0" alt="omage" class="img-responsive"> <img od="4" src="img/home/04.jpg" border="0" alt="omage" class="img-responsive"> </div> </body>子句为:

WHERE

这修复了一个逻辑错误。它可能会修复你得到的结果。

我也会将逻辑编写为:

       WHERE DATEDIFF(DAY, UF.InsertDateTime, DATEADD(DAY, T.i, GETDATE())) = 0 AND
             UF.IsFollowed = 1 AND
             (U.IsMUser = 1 OR U.IsFUser = 1)

在将日期/时间转换为日期时,SQL Server将使用索引,因此这是可搜索的,而您的版本不是。

答案 1 :(得分:1)

尝试此查询,

;WITH [CTE_DATE]
AS
(
    SELECT CAST(GETDATE() AS DATE)  AS [DATE]
    UNION ALL
    SELECT DATEADD(DD,-1,[DATE]) FROM [CTE_DATE] WHERE DATEDIFF(DD,[DATE],GETDATE()) <= 5
)

SELECT [DATE] ,(SELECT COUNT(*) 
                FROM userfollowers INNER JOIN [user] U on U.UserId = UF.UserFollowerId UF 
                WHERE CAST(UF.InsertDateTime AS DATE) = [DATE] 
                AND UF.IsFollowed = 1 and (U.IsMUser = 1 or U.IsFUser = 1)) AS TotalCount
FROM [CTE_DATE]