【问题标题】:SQL Filter query if column has more than one distinct value如果列具有多个不同的值,则 SQL 过滤器查询
【发布时间】:2018-11-05 09:47:33
【问题描述】:

如果下载计数超过2,我有一个查询返回用户的Date UsernameDownload Count

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,两次下载了file2Download 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

如果我误解了,请告诉我。谢谢。

【问题讨论】:

  • 您可以将HAVING Count(*) > 1 更改为HAVING Count(distinct fileNumber) > 1 以计算每个组的不同文件编号。
  • @JohnLBevan:您最好将此作为答案添加,因为当前的两个答案都是错误的:-)
  • 谢谢@dnoeth / 现在有了这个解决方案的答案:stackoverflow.com/a/53152809/361842

标签: sql sql-server tsql group-by


【解决方案1】:

在所有三个地方都使用COUNT(DISTINCT fileNumber)

【讨论】:

  • 在实施您的答案后,我编辑了我的问题以添加到查询中:)
  • 我将所有COUNT(*) 替换为COUNT(DISTINCT filenumber)
【解决方案2】:

希望这会有所帮助,通过在派生表中选择所需列的不同列,您可以获得所需的粒度级别。

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

【讨论】:

  • 这个不回答问题,同一天两个不同的时间戳会是Distinct(需要Cast in the Distinct Select 或者干脆应用Distinct in COUNT)
【解决方案3】:

使用group by 中的fileNumber 列并选择列表

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 

【讨论】:

  • 谢谢。所以我需要在我的SELECTGROUP BY 语句中添加filenumber,对吗?
  • 这没有回答问题,它返回了多次下载的文件编号。
  • 这只会给结果增加更多噪音...... OP 可能不想要的数据。
猜你喜欢
  • 1970-01-01
  • 2019-02-18
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多