Sql 在时间范围内选择唯一/不同的条目
这是我在dc中的虚拟机表布局。我们每小时收集一次指标,但要防止出现两次投票,然后在给定的一小时内以两次信息结束的情况 下面是我的桌子Sql 在时间范围内选择唯一/不同的条目,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,这是我在dc中的虚拟机表布局。我们每小时收集一次指标,但要防止出现两次投票,然后在给定的一小时内以两次信息结束的情况 下面是我的桌子 VM_Name NUM_VCPU POWER_STATE MEMORY_MB IMPORTEDTIMESTAMP ------------------------------------------------------------------------- FERNANDO TEST 2012 4
VM_Name NUM_VCPU POWER_STATE MEMORY_MB IMPORTEDTIMESTAMP
-------------------------------------------------------------------------
FERNANDO TEST 2012 4 1 16384 2017-01-10 10:13:42.353
FERNANDO TEST 2012 R2 4 0 8192 2017-01-10 10:13:42.353
之前是我用来获取上述信息的查询
SELECT Count([VM_NAME]) as Num_VM
,sum([NUM_VCPU]) as SUM_NUM_VCPU
,SUM([MEMORY_MB]) as SUM_MEM_MB
,SUM([MEMORY_MB])/1024 as SUM_MEM_GB
,dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0) as IMPORTEDTIMESTAMPROUND
FROM VM_DATA
Where POWER_STATE = 1
group by dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0)
我得到
Num_VM SUM_NUM_VCPU SUM_MEM_MB SUM_MEM_GB IMPORTEDTIMESTAMPROUND
---------------------------------------------------------------------------
2 |4 |24576 |24 |2017-01-10 16:00:00.000
1 |2 |12288 |12 |2017-01-11 02:00:00.000
1 |2 |12288 |12 |2017-01-11 03:00:00.000
正如你在下午4点(2017-01-10 16:00:00.000)看到的,有一个测试双重投票,现在我有了双重标准。如何调整查询以获得不同的值,我想必须执行子查询,但不确定在何处
编辑以进一步澄清
所以在2017-01-10 16:00:00.000,我进行了两次民意调查,现在我有重复的记录。我需要选择distinct vm_name和distinct TimesMap来删除重复的虚拟机,然后计算所有虚拟机,汇总cpu和内存,并按timesatmp对它们进行分组。最简单的解决方案是使用
avg()
:
否则。只需使用行编号()
。似乎没有必要进行汇总:
select d.*
from (select d.*,
(partition by year(IMPORTEDTIMESTAMP), month(IMPORTEDTIMESTAMP), day(IMPORTEDTIMESTAMP), datepart(hour, IMPORTEDTIMESTAMP)
order by IMPORTEDTIMESTAMP
) as seqnum
from vm_data d
) d
where seqnum = 1;
所以问题是,您的记录实际上不是重复的,而是因为时间戳舍入而出现的?使用DISTINCT时会发生什么?我假设它在对时间戳进行任何舍入之前考虑了列,这将返回相同的结果。我认为你需要将你的取整日期转换为一个varchar,然后可能distinct会将它识别为一个实际的副本 见: 我得把它清理干净,但我想出的办法奏效了。它检查VM_名称的不同计数的数量是否应与时间戳的计数相匹配。如果我的时间戳多于不同的名称,那么我知道在给定的时间范围内我有多个条目。我对和进行除法以得到正确的数字
我不知道是否有更好的方法来实现这一点,但它是有效的 我编辑了我的评论,添加了一些澄清。AVG不起作用,因为我需要一个小时的CPU和内存之和,虚拟机的数量。看看我的编辑是否有意义/是否有任何帮助
select d.*
from (select d.*,
(partition by year(IMPORTEDTIMESTAMP), month(IMPORTEDTIMESTAMP), day(IMPORTEDTIMESTAMP), datepart(hour, IMPORTEDTIMESTAMP)
order by IMPORTEDTIMESTAMP
) as seqnum
from vm_data d
) d
where seqnum = 1;
SELECT DISTINCT Count([VM_NAME]) as Num_VM
,sum([NUM_VCPU]) as SUM_NUM_VCPU
,SUM([MEMORY_MB]) as SUM_MEM_MB
,SUM([MEMORY_MB])/1024 as SUM_MEM_GB
,CONVERT(char(10), dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0), 126) as IMPORTEDTIMESTAMPROUND
FROM VM_DATA
Where POWER_STATE = 1
group by CONVERT(char(10), dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0), 126)
case when (count(dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0))-count(Distinct(VM_Name))) = 0 then SUM(NUM_VCPU)
else SUM(NUM_VCPU)/(count(dateadd(hour, datediff(hour, 0, IMPORTEDTIMESTAMP), 0))/count(Distinct(VM_Name))) end as SUM_VCPU