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

PJZ*_*PJZ 2 sql t-sql sql-server

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

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

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

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

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

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

OMG*_*ies 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)