sql 选定列的 dw count(*) 不聚合
sql dw count(*) with selected columns doesn't aggregate
这很奇怪,我已经在许多数据库上进行了此查询,但在这里我被难住了。
我知道我的 Synapse table 有重复项
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, ReadingDate, IntervalNumber, count(*) as cnt
FROM [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX'
and readingdate = '2020-10-08'
and IntervalNumber = 12
group by nmiandnmisuffixkey, ReadingDate, IntervalNumber
我得到以下信息:-
+--------------------+-------------+----------------+-----+
| nmiandnmisuffixkey | ReadingDate | IntervalNumber | cnt |
+--------------------+-------------+----------------+-----+
| XXXXXXXXXX | 2020-10-08 | 12 | 1 |
| XXXXXXXXXX | 2020-10-08 | 12 | 1 |
+--------------------+-------------+----------------+-----+
为什么计数不加总?
你的table肯定有ID。当您计算 (*) 时,它会包含 ID。首先,将所需的字段放在临时 table 中,然后分组依据。
这样:
SELECT
nmiandnmisuffixkey, ReadingDate, IntervalNumber
Into
#tmp FROM [dbo].[factMeterDataDetail]
where
nmiandnmisuffixkey = 'XXXXXXXXXX' and readingdate = '2020-10-08' and IntervalNumber = 12
Select
nmiandnmisuffixkey, ReadingDate, IntervalNumber,count (*)as cnt
from
#tmp
Group by
nmiandnmisuffixkey, ReadingDate, IntervalNumber
这是您的查询:
select nmiandnmisuffixkey, ReadingDate, IntervalNumber, count(*) as cnt
from [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX' and
readingdate = '2020-10-08' and
IntervalNumber = 12
group by nmiandnmisuffixkey, ReadingDate, IntervalNumber
查询正在过滤 group by
中使用的每个列的特定值。然而,在对它们进行聚合时,您会得到多行。
因此,您的问题实际上是:“相等比较何时不符合聚合的“相等”概念?”
我确定这不是一个完整的列表。
一种可能是 IntervalNumber
确实是一个字符串。 =
将值转换为数字,因此 '012'
和 '12'
对于相等性相同,但对于聚合则不同。 (Here 是一个例子。)
换句话说,类型转换会导致这种差异。
字符串和排序规则可能会出现这种情况。通常,我希望出现归类冲突错误。但是您可能会检查字符串列是否具有与数据库默认值(将用于字符串常量)不同的显式排序规则。
我认为您的日期比较没有等效差异。
我还应该注意这个 use-case 的解决方法:
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
的聚合查询。保证return一行。
一些可能性-
- 日期不同 time/millisecond。因此,您可以尝试再次删除时间部分和 运行 按查询分组。
- string column(key) 可以在结尾或开头有白色 spaces。您可以再次使用 ltrim/rtrim 和 运行 分组查询。客户端工具会将它们显示为与您的输出相同的数据。通过修剪 space 可以进行真正的比较。
在 OP 的案例中,是案例 #2。使用 ltrim/rtrim 解决了聚合问题。
这很奇怪,我已经在许多数据库上进行了此查询,但在这里我被难住了。 我知道我的 Synapse table 有重复项
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, ReadingDate, IntervalNumber, count(*) as cnt
FROM [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX'
and readingdate = '2020-10-08'
and IntervalNumber = 12
group by nmiandnmisuffixkey, ReadingDate, IntervalNumber
我得到以下信息:-
+--------------------+-------------+----------------+-----+
| nmiandnmisuffixkey | ReadingDate | IntervalNumber | cnt |
+--------------------+-------------+----------------+-----+
| XXXXXXXXXX | 2020-10-08 | 12 | 1 |
| XXXXXXXXXX | 2020-10-08 | 12 | 1 |
+--------------------+-------------+----------------+-----+
为什么计数不加总?
你的table肯定有ID。当您计算 (*) 时,它会包含 ID。首先,将所需的字段放在临时 table 中,然后分组依据。
这样:
SELECT
nmiandnmisuffixkey, ReadingDate, IntervalNumber
Into
#tmp FROM [dbo].[factMeterDataDetail]
where
nmiandnmisuffixkey = 'XXXXXXXXXX' and readingdate = '2020-10-08' and IntervalNumber = 12
Select
nmiandnmisuffixkey, ReadingDate, IntervalNumber,count (*)as cnt
from
#tmp
Group by
nmiandnmisuffixkey, ReadingDate, IntervalNumber
这是您的查询:
select nmiandnmisuffixkey, ReadingDate, IntervalNumber, count(*) as cnt
from [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX' and
readingdate = '2020-10-08' and
IntervalNumber = 12
group by nmiandnmisuffixkey, ReadingDate, IntervalNumber
查询正在过滤 group by
中使用的每个列的特定值。然而,在对它们进行聚合时,您会得到多行。
因此,您的问题实际上是:“相等比较何时不符合聚合的“相等”概念?”
我确定这不是一个完整的列表。
一种可能是 IntervalNumber
确实是一个字符串。 =
将值转换为数字,因此 '012'
和 '12'
对于相等性相同,但对于聚合则不同。 (Here 是一个例子。)
换句话说,类型转换会导致这种差异。
字符串和排序规则可能会出现这种情况。通常,我希望出现归类冲突错误。但是您可能会检查字符串列是否具有与数据库默认值(将用于字符串常量)不同的显式排序规则。
我认为您的日期比较没有等效差异。
我还应该注意这个 use-case 的解决方法:
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
的聚合查询。保证return一行。
一些可能性-
- 日期不同 time/millisecond。因此,您可以尝试再次删除时间部分和 运行 按查询分组。
- string column(key) 可以在结尾或开头有白色 spaces。您可以再次使用 ltrim/rtrim 和 运行 分组查询。客户端工具会将它们显示为与您的输出相同的数据。通过修剪 space 可以进行真正的比较。
在 OP 的案例中,是案例 #2。使用 ltrim/rtrim 解决了聚合问题。