如何使用SELECT COUNT DISTINCT?

3

我有一个选择COUNT distinct的问题:我需要的答案是6。 在计数时,时间差小于300秒视为1。 我的SQL语句:

SELECT COUNT(DISTINCT(cast([Date] as date) + cast([time] as datetime)))
FROM [Table1]WHERE [DATE] = '2013-06-22'
AND ErrCode = 'Scrubber Failure'AND Frequency = 1


你使用的数据库系统是什么? - Aleksandr Fedorenko
看起来像是使用 [Date] 语法的 SQL Server。 - Bohemian
Alex - SQL Server 2008 - user2286756
如果您的条件结果会重叠,该怎么办? - Aleksandr Fedorenko
重叠?只要时间差小于300秒且设备在同一组='A',则仅计为1。 - user2286756
1个回答

1

UPDATED

SELECT COUNT(DISTINCT 
             ROUND(CONVERT(DECIMAL(20, 4), 
                     DATEDIFF(minute, 
                              CONVERT(datetime, '2013-01-01 00:00:00', 120), 
                              CONVERT(datetime, date + ' ' + time, 120))) / 5, 0)) n
  FROM table1
 WHERE date = '2013-06-22'
   AND errcode = 'Scrubber Failure'
   AND frequency = 1

输出:

| N |
-----
| 6 |

这里是SQLFiddle演示。


谢谢回复...嗯,您正在与“2013-01-01 00:00:00”(固定日期)进行比较。嗯...我在想,如果有数据更新到“2014-06-22”(已更新模式),会发生什么。为什么要除以(/5)?使用新模式,答案应该是=7。 - user2286756
任何日期都可以作为基准日期,只需要在WHERE子句中将其设置为小于或等于您的日期过滤器的低端点,并且只需计算以分钟为单位的时间差。在您的特定示例中,它也可以是“2013-06-22”。 300秒/60 = 5分钟间隔,这就是为什么要将差异除以5。现在这里有一个更新的sqlfiddle,其中包含日期“2014-06-22”http://sqlfiddle.com/#!3/1ebf0/1。结果是7。 - peterm
嗯..我已经更新了模式。现在答案应该是7。因为DATEDIFF(SECOND,'2014-06-22 08:19:26','2014-06-22 08:20:26')<300秒。请给予建议。 - user2286756
@user2286756,你看到我更新的sqlfiddle了吗?你在哪里更新了模式?如果你更改了我的sqlfiddle,那么你应该点击“构建模式”,在浏览器中获取一个新链接,并在此处发布它。 - peterm
请参见更新的答案,这是更新后的SQLFiddle:http://sqlfiddle.com/#!3/b74cb/29,其中提供了您的答案。 - peterm
我已经更新了模式(schema)和MySQL语句,接近完成。但是我无法获得最后一行的日期差(datediff)... http://sqlfiddle.com/#!3/da2b4/1 - user2286756

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接