使用group by为SQL过滤日期时间

时间:2014-07-24 20:27:56

标签: sql sql-server sql-server-2008 sql-server-2012 greatest-n-per-group

我试图制作一个sql,但它无法正常工作。

我有一张这样的表:

访问量|什么电脑有访问|什么是日期和时间

  11                   computer 1             2013-12-30 09:00:00
  2                    computer 2             2013-12-30 10:00:00
  30                   computer 2             2013-12-30 10:11:00
  17                   computer 3             2013-12-30 17:30:00  
  200                  computer 4             2013-12-30 07:00:00
  150                  computer 1             2013-12-30 14:00:00
  19                   computer 1             2013-12-30 06:00:00

我想做的是一个结果,它只向我显示:在每台计算机中,有多少是最大访问次数和时间?上表中的结果os SQL将是这样的:

访问量|什么电脑有访问|什么是日期和时间

  30                   computer 2              2013-12-30 10:11:00
  17                   computer 3              2013-12-30 17:30:00  
  200                  computer 4              2013-12-30 07:00:00
  150                  computer 1              2013-12-30 14:00:00

计算机2在2013-12-30 10:00:00的准确时间内最多可以进行30次 ........

问题是如何在每个结果中显示exacly日期? 有人帮忙吗?

感谢

4 个答案:

答案 0 :(得分:5)

我认为您希望每台计算机访问次数最多的日期?您可以在CTE中使用row_number。 SQL Fiddle

with CTE
as 
(select
 accesses,
 computer,
 dt,
 row_number() over (partition by computer order by accesses desc) rn
 from
 table1
 )

select
* 
from
CTE
where
rn = 1

答案 1 :(得分:3)

您可以使用子查询来执行此操作,其中您首先限制要查找的值,然后将它们连接回主表。我根据您的信息创建了一个示例。这适用于SQL 2005,允许使用特定日期/时间返回的最大访问次数,而不是将最大访问次数与最大日期相结合,这可能并不总是正确的。

CREATE TABLE #Tmp(QoA INT NOT NULL, 
    Computer VARCHAR(30) NOT NULL,
    AccDt DATETIME NOT NULL)

    Insert into #Tmp values (11,'computer 1','2013-12-30 09:00:00')
    Insert into #Tmp values (2,'computer 2','2013-12-30 10:00:00')
    Insert into #Tmp values (30,'computer 2','2013-12-30 10:11:00')
    Insert into #Tmp values (17,'computer 3','2013-12-30 17:30:00')
    Insert into #Tmp values (200,'computer 4','2013-12-30 07:00:00')
    Insert into #Tmp values (150,'computer 1','2013-12-30 14:00:00')
    Insert into #Tmp values (19,'computer 1','2013-12-30 06:00:00')

    Select * From #Tmp

    Select m.* 
    from #Tmp m
    Join (Select Max(QoA) 'QoA', Computer 
            from #Tmp
            Group by Computer) l
            on m.qoa = l.qoa and m.computer = l.computer

    Drop table #Tmp

结果 QoA Computer AccDt

200 computer 4 2013-12-30 07:00:00.000

17 computer 3 2013-12-30 17:30:00.000

30 computer 2 2013-12-30 10:11:00.000

150 computer 1 2013-12-30 14:00:00.000

答案 2 :(得分:2)

喜欢这个。

with MySortedData as
(
    select
        ROW_NUMBER() over(partition by computer order by quantity_of_access desc) as RowNum
        , quantity_of_access
        , computer
        , datetimecolumn
    from
      mytable
)

select *
from MySortedData
where RowNum = 1

答案 3 :(得分:1)

您正在寻找的日期不是很清楚,但看起来您正在寻找最大日期,通过计算机分组并找到最大结果。

select
  max(quantity_of_access),
  computer,
  max(datetimecolumn)
from
  mytable
group by
  computer