【问题标题】:SQL select last group date?SQL选择最后一组日期?
【发布时间】:2013-01-15 16:04:23
【问题描述】:

我的桌子是这样的:

Date    DataPoint      Type    Value
2000         HVAC    Phase1      220
2000         HVAC    Phase2      221
2000       SERVER    Phase1      222
2000       SERVER    Phase2      223
2001         HVAC    Phase1      220
2001         HVAC    Phase2      221
2001       SERVER    Phase1      222
2001       SERVER    Phase2      223
2002         HVAC    Phase1      220
2002         HVAC    Phase2      221
2002       SERVER    Phase1      222
2002       SERVER    Phase2      223
...
...
2013         HVAC    Phase1      220
2013         HVAC    Phase2      221
2013       SERVER    Phase1      222
2013       SERVER    Phase2      223

我想获取最后日期、数据点、类型值的总和。

预期结果

Date    DataPoint        Value
2013         HVAC          441
2013       SERVER          445

我该怎么做?提示、起点、代码示例?

谢谢...

【问题讨论】:

  • 为什么2012年及以下的记录不计算在内?您需要具体说明年份吗?
  • @JW。 “我想知道最后一次约会”

标签: sql sql-server sql-server-2008 select group-by


【解决方案1】:

使用TOP... WITH TIES 来简化:

SELECT TOP 1 WITH TIES Date, DataPoint, SUM(Value) AS Value
FROM YourTable
GROUP BY Date, DataPoint
ORDER BY Date DESC

SQL Fiddle

【讨论】:

  • 最简单的答案...也谢谢
【解决方案2】:

您还可以使用子查询获取max(date),然后将其连接回主表:

select t1.date,
  t1.datapoint,
  sum(t1.value) Total
from yourtable t1
inner join
(
  select max(date) date,
    datapoint
  from yourtable
  group by datapoint
) t2
  on t1.date = t2.date
  and t1.datapoint = t2.datapoint
group by t1.date, t1.datapoint;

SQL Fiddle with Demo

你也可以使用sum() over()row_number() over()来得到结果:

select  Date,  DataPoint, total
from
(
  select Date,
    DataPoint,        
    sum(value) over(partition by DataPoint, Date) total,
    row_number() over(partition by DataPoint order by Date DESC) rn
  from yourtable
) src
where rn = 1

SQL Fiddle with Demo

结果是:

| DATE | DATAPOINT | TOTAL |
----------------------------
| 2013 |      HVAC |   441 |
| 2013 |    SERVER |   445 |

【讨论】:

    【解决方案3】:
    WITH latestDate
    AS
    (
        SELECT  DataPoint, MAX(Date) max_DATE
        FROM tableName
        GROUP BY DataPoint
    )
    SELECT  a.Date, a.DataPoint, SUM(a.Value) totalValue
    FROM    tableName a
            INNER JOIN latestDate b
                ON a.DataPoint = b.DataPoint AND
                    a.Date = b.max_date
    GROUP BY a.Date, a.DataPoint
    

    感谢 BlueFeet 提供 SQLFiddle。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2015-01-18
      • 2015-11-02
      • 2011-09-04
      • 2014-11-29
      相关资源
      最近更新 更多