我一直在网站上查看其他T-SQL问题,包括DISTINCT和MAX几个小时,但找不到任何符合我需要的东西。这是我的数据集和查询目标的描述。非常感谢任何指导。
数据集 数据集是上一个结算周期中的客户,客户站点,日期和值的列表,包含以下列。单个客户可以拥有多个站点:
客户,网站,日期,计数器,CounterValue,CollectorNode
查询要求 对于给定的结算周期,我想选择以下
我的挑战是我无法返回所有列,同时为每个列选择DISTINCT列和MAX。我的多次尝试会为每个客户/网站组合返回多条记录。
答案 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
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