Sql 在时间范围内选择唯一/不同的条目

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

这是我在dc中的虚拟机表布局。我们每小时收集一次指标,但要防止出现两次投票,然后在给定的一小时内以两次信息结束的情况

下面是我的桌子

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