Запрос фильтра SQL, если столбец имеет более одного отдельного значения - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть запрос, который возвращает Date Username и Download Count пользователя, если количество загрузок превышает 2.

SELECT CONVERT(DATE, [datetime]) 'Date', 
       actionby                  AS 'Username', 
       Count(*)                  'Download Count' 
FROM   [dbo].[log] 
WHERE  actiontaken = 'Download' 
       AND type = 'Document' 
       AND CONVERT(DATE, [datetime]) BETWEEN 
           CONVERT(DATE, 
           '" + scanStartDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "') 
           AND 
CONVERT(DATE, '" + scanEndDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "') 
GROUP  BY CONVERT(DATE, [datetime]), 
          actionby 
HAVING Count(*) > 1 
ORDER  BY Count(*) DESC

Ниже приведена таблица

+------------+----------+----------------+
|    Date    | Username | Download Count |
+------------+----------+----------------+
| 01/01/2018 | Jane     |              3 |
+------------+----------+----------------+

Jane сделал 3 загрузки.

Но 2 из них - это один и тот же файл (обозначен fileNumber).

Как я могу изменить свой запрос, чтобы он не добавлял дублирующихся загрузок каких-либо fileNumber на эту дату?

например. Джейн скачала file1 один раз и file2 дважды. Download Count будет считать 2 вместо 3.

Спасибо


РЕДАКТИРОВАТЬ : После реализации ответа @ salman-a:

SELECT CONVERT(DATE, [datetime])  'Date', 
       actionby                   'Username', 
       COUNT(DISTINCT filenumber) 'Download Count' 
FROM   [dbo].[log] 
WHERE  actiontaken = 'Download' 
       AND type = 'Document' 
       AND CONVERT(DATE, [datetime]) BETWEEN 
           CONVERT(DATE, 
           '" + scanStartDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "') 
           AND 
CONVERT(DATE, '" + scanEndDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "') 
GROUP  BY CONVERT(DATE, [datetime]), 
          actionby
HAVING COUNT(DISTINCT filenumber) > 1 
ORDER  BY COUNT(DISTINCT filenumber) DESC

Дайте мне знать, если я неправильно понял. Спасибо.

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

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

SELECT Date, ActionBy AS 'Username', COUNT(*) 'Download Count' 

( SELECT DISTINCT CONVERT(date, [DateTime]) 'Date',FileNumber,ActionBy,ActionTaken,Type 
FROM [dbo].[Log])a 

WHERE ActionTaken = 'Download' and Type = 'Document' and CONVERT(date, [DateTime]) 

BETWEEN CONVERT(date,'" + scanStartDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "') 
and CONVERT(date,'" + scanEndDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "') 

GROUP BY CONVERT(date, [DateTime]), ActionBy 

HAVING COUNT(*) > 1 

ORDER BY COUNT(*) DESC
0 голосов
/ 05 ноября 2018

Используйте COUNT(DISTINCT fileNumber) во всех трех местах.

0 голосов
/ 05 ноября 2018

Используйте fileNumber столбец в group by и выберите список

select [date],Username,[Download Count] 
from
(SELECT CONVERT(DATE, [datetime]) 'Date', 
           actionby                  AS 'Username', 
           filenumber, 
           Count(*)                  'Download Count' 
    FROM   [dbo].[log] 
    WHERE  actiontaken = 'Download' 
           AND type = 'Document' 
           AND CONVERT(DATE, [datetime]) BETWEEN 
               CONVERT(DATE, 
               '" + scanStartDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "') 
               AND 
    CONVERT(DATE, '" + scanEndDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "') 
    GROUP  BY CONVERT(DATE, [datetime]), 
              actionby, 
              filenumber )X
   where [Download Count]>1 
    ORDER  BY [Download Count] DESC 
...