带有选定列的sql dw count*不聚合

问题描述

这很奇怪,我已经在许多数据库上执行过此查询,但是在这里我很困惑。 我知道我的Synapse表有重复项

SELECT nmiandnmisuffixkey,ReadingDate,IntervalNumber
FROM [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX'
and readingdate = '2020-10-08'
and IntervalNumber = 12 

产生

+--------------------+-------------+----------------+
| nmiandnmisuffixkey | ReadingDate | IntervalNumber |
+--------------------+-------------+----------------+
| XXXXXXXXXX         | 2020-10-08  |             12 |
| XXXXXXXXXX         | 2020-10-08  |             12 |
+--------------------+-------------+----------------+

但是当我尝试执行以下操作

SELECT nmiandnmisuffixkey,IntervalNumber,count(*) as cnt
FROM [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX'
and readingdate = '2020-10-08'
and IntervalNumber = 12
group by nmiandnmisuffixkey,IntervalNumber

我得到以下信息:-

+--------------------+-------------+----------------+-----+
| nmiandnmisuffixkey | ReadingDate | IntervalNumber | cnt |
+--------------------+-------------+----------------+-----+
| XXXXXXXXXX         | 2020-10-08  |             12 |   1 |
| XXXXXXXXXX         | 2020-10-08  |             12 |   1 |
+--------------------+-------------+----------------+-----+

为什么计数不累加?

解决方法

这是您的查询:

select nmiandnmisuffixkey,ReadingDate,IntervalNumber,count(*) as cnt
from [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX' and
      readingdate = '2020-10-08' and
      IntervalNumber = 12
group by nmiandnmisuffixkey,IntervalNumber

查询正在过滤group by中使用的每个列的特定值。但是,在它们上聚合时会得到多行。

因此,您的问题确实是:“什么时候平等比较不符合聚合的“平等”概念?”

我确定这不是一个完整的列表。

一种可能性是IntervalNumber实际上是一个字符串。 =将值转换为数字,因此'012''12'在相等性上是相同的,但在聚合上却不相同。 (Here是一个示例。)

换句话说,类型转换会导致这种差异。

这可能发生在字符串和排序规则中。通常,我会期望归类冲突错误。但是您可以检查字符串列是否具有与数据库默认值(用于字符串常量)不同的显式排序规则。

我认为您的日期比较没有相同的差异。

我还应注意此用例的解决方法:

select max(nmiandnmisuffixkey),max(ReadingDate),max(IntervalNumber),count(*) as cnt
from [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX' and
      readingdate = '2020-10-08' and
      IntervalNumber = 12;

也就是说,只使用不带group by的聚合查询。保证返回一行。

,

一些可能性-

  1. 日期具有不同的时间/毫秒。因此,您可以尝试删除时间部分,然后再次按查询分组。
  2. 字符串列(键)的结尾或开头可以有空格。您可以使用ltrim / rtrim并再次运行group by查询。客户端工具会将它们显示为与您的输出相同的数据。通过修剪空间,可以进行真正的比较。

在OP的情况下,这是情况2。使用ltrim / rtrim解决了agg问题。

,

您的表中肯定有一个ID。当您计算(*)时,它包括ID。首先,将所需的字段放入临时表中,然后进行分组。

通过这种方式:

SELECT
    nmiandnmisuffixkey,IntervalNumber
Into
    #tmp FROM [dbo].[factMeterDataDetail]
where
    nmiandnmisuffixkey = 'XXXXXXXXXX' and readingdate = '2020-10-08' and IntervalNumber = 12

Select
    nmiandnmisuffixkey,count (*)as cnt
from
    #tmp 
Group by
    nmiandnmisuffixkey,IntervalNumber