在另一列中选择带有MAX的列子集的DISTINCT记录

时间:2010-11-21 17:59:17

标签: sql sql-server tsql

我一直在网站上查看其他T-SQL问题,包括DISTINCT和MAX几个小时,但找不到任何符合我需要的东西。这是我的数据集和查询目标的描述。非常感谢任何指导。

数据集 数据集是上一个结算周期中的客户,客户站点,日期和值的列表,包含以下列。单个客户可以拥有多个站点:

客户,网站,日期,计数器,CounterValue,CollectorNode

查询要求 对于给定的结算周期,我想选择以下

  • DISTINCT(客户和网站)
  • 每个DISTINCT客户和网站的结算周期的MAX(CounterValue)
  • 同时仍然从表中收集该记录的所有字段(CollectorNode,Date,Counter)

我的挑战是我无法返回所有列,同时为每个列选择DISTINCT列和MAX。我的多次尝试会为每个客户/网站组合返回多条记录。

2 个答案:

答案 0 :(得分:7)

使用自我加入:

SELECT ds.customer,
       ds.site,
       ds.counter, 
       ds.countervalue,
       ds.collectornode
  FROM DATASET ds
  JOIN (SELECT t.customer,
               t.site,
               MAX(t.countervalue) AS max_countervalue
          FROM DATASET t
      GROUP BY t.customer, t.site) x ON x.customer = ds.customer
                                    AND x.site = ds.site
                                    AND x.max_countervalue = ds.countervalue

使用CTE& ROW_NUMBER(SQL Server 2005 +):

WITH example AS (
   SELECT ds.customer,
          ds.site,
          ds.counter, 
          ds.countervalue,
          ds.collectornode,
          ROW_NUMBER() OVER(PARTITION BY ds.customer, ds.site
                                ORDER BY ds.countervalue DESC) AS rank
     FROM DATASET ds)
SELECT e.customer,
       e.site,
       e.counter, 
       e.countervalue,
       e.collectornode
  FROM example e
 WHERE e.rank = 1

答案 1 :(得分:1)

使用子查询进行分组并将结果连接回原始表,如下所示:

SELECT g.Customer, g.Site, c.Date, c.Counter, g.MaxCounterValue, c.CollectorNode
FROM Customers c
INNER JOIN
(
SELECT Customer, Site, MAX(CounterValue) MaxCounterValue
FROM Customers
GROUP BY Customer, Site
) g
ON g.Customer = c.Customer
AND g.Site = g.Site