【问题标题】:Sql COUNT column by date and select the correspondent dateSql COUNT 按日期列并选择对应日期
【发布时间】:2012-05-07 12:08:45
【问题描述】:

我在SQL Count for a Date ColumnSQL to get count by date 之前读过,但这些都不是我的问题。

我有以下表格记录(表格只有两列)

| VALUE   | TIME               |
--------------------------------
| test    | 04.05.2012 11:46:46|
| test2   | 04.05.2012 11:46:49|
| test3   | 06.05.2012 11:47:46|
| test2   | 05.05.2012 11:47:46|
| test    | 04.05.2012 11:51:46|

我想显示如下:

| VALUE   | COUNT   | NEWTIME  |
--------------------------------
| test    | 2       |04.05.2012|
| test2   | 1       |04.05.2012|
| test2   | 1       |05.05.2012|
| test3   | 1       |06.05.2012|

我通过使用day 作为TIME 的日期部分来计算VALUE,例如:

select datepart(d, TIME), count(VALUE) from table1
group by datepart(d, TIME)

如何获得额外的NEWTIME 列?在 SQL Server 2005 中可以吗?

谢谢

【问题讨论】:

  • 我不太明白newtime的意思,不过你可以试试在count(...)后面加上max(datepart(d, DATE))
  • datepart(d, TIME) 返回月份中的某天。这真的是你想要的吗?它将2012-05-072012-06-07 分组。
  • 是的,你说得对......也许我必须按天+月+年分组更好

标签: sql sql-server-2005


【解决方案1】:
select VALUE,
       count(*) as COUNT,
       dateadd(day, datediff(day, 0, TIME), 0) as NEWTIME
from YourTable
group by VALUE, dateadd(day, datediff(day, 0, TIME), 0)

SE-Data

【讨论】:

  • 如何按年+月+日分组?
  • 能否告诉我如何保持小时、分钟和秒不变?因为如果我使用dateadd(day, datediff(day, 0, TIME), 0),那么时间是 00:00:00。我想让它们完好无损
  • @MichaelSwan - 结果中不能包含时间部分,并且只能在日期上同时包含时间组。
  • 如果可能的话每小时或每分钟
  • @MichaelSwan 您可以拥有组成组的 一个 行的时间部分。喜欢min(TIME)max(TIME)。如果您考虑一下,您会发现,如果一天中的一个组由具有不同时间部分的许多行组成,您必须选择您想要的行上的时间。
【解决方案2】:

您可以像这样添加它并对其进行格式化,但您还必须按它进行分组。

select value, datepart(d, TIME), count(VALUE), datepart(mmonth, time) + '.' + datepart(day, time) + '.' + datepart(year, time) as newtime
from table1
group by datepart(d, TIME, newtime) 

如果您不关心使用句点作为分隔符,那么可以更简单一些。

select value, datepart(d, TIME), count(VALUE), convert(varchar, time, 101) as newtime
from table1
group by datepart(d, TIME, newtime) 

我还注意到您的输出中有重复项,我个人会这样做:

select value, count(*) as cnt, convert(varchar, time, 101) as newtime
from table1
group by value, newtime

【讨论】:

    【解决方案3】:
    select VALUE, count(VALUE), datepart(d, MIN(TIME)) AS NEWTIME
    from table1
    group by datepart(d, TIME)
    

    您可以使用MINMAX 聚合函数。在您的情况下,这无关紧要,因为您通过datepart一整天 级别进行分组。

    【讨论】:

      【解决方案4】:

      没有测试过,但我会这样做

      select VALUE, count(*) AS COUNT, convert(date, max(TIME)) AS NEWTIME --max , min whatever 
      from table1
      group by VALUE, datepart(d, TIME) --dont know why you group by timne not value 
      

      【讨论】:

        【解决方案5】:

        我真的不明白你的问题,但如果我理解正确,你想按时间列中的短日期对数据进行分组吗?如果是这样,结果是:

        select max(VALUE) as VALUE, count(VALUE) as count, CONVERT(VARCHAR(10), TIME , 104) as newtime
        from table1
        group by CONVERT(VARCHAR(10), TIME , 104)
        

        如果你不按它们分组,我不明白为什么要显示这些值

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 2019-09-28
          • 2016-11-17
          相关资源
          最近更新 更多