Выбор записей DISTINCT для подмножества столбцов с MAX в другом столбце - PullRequest
2 голосов
/ 21 ноября 2010

Я уже пару часов рассматриваю другие вопросы по T-SQL, включая DISTINCT и MAX, на сайте, но не могу найти ничего, что бы полностью соответствовало моим потребностям. Вот описание моего набора данных и целей запроса. Любое руководство высоко ценится.

Dataset Набор данных - это список клиентов, сайтов клиентов, дат и значений последнего цикла выставления счетов со следующими столбцами. Один клиент может иметь несколько сайтов:

Клиент, Сайт, Дата, Счетчик, CounterValue, CollectorNode

Требования к запросу Для данного биллингового цикла я бы хотел выбрать следующий

  • DISTINCT (Клиент и Сайт)
  • MAX (CounterValue) для этого цикла выставления счетов для каждого клиента DISTINCT и сайта
  • Возвращая все поля для этой записи из таблицы (CollectorNode, Date, Counter)

Моя проблема здесь - моя неспособность вернуть все столбцы при выборе столбцов DISTINCT и MAX для каждого. Мои многочисленные попытки вернуть несколько записей для каждой комбинации клиент / сайт.

Ответы [ 2 ]

7 голосов
/ 21 ноября 2010

Использование собственного JOIN:

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 голос
/ 21 ноября 2010

Используйте подзапрос для группировки и присоедините результат обратно к исходной таблице, например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...