Группировка в SQL-выражении - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть следующий оператор SQL:

    SELECT TOP 30
    a.ClassAdID,    -- 0
    a.AdTitle,      -- 1
    a.ClassAdCatID, -- 2
    b.ClassAdCat,   -- 3
    a.Img1,         -- 4
    e.Domain,       -- 5
    a.AdText,       -- 6
    a.RegionID,     -- 7
    a.IsEvent,      -- 8
    a.IsCoupon,     -- 9
    b.ParentID,     -- 10
    a.MemberID,     -- 11
    a.AdURL,        -- 12
    a.Location,     -- 13
    a.GroupID       -- 14
    FROM ClassAd a
    INNER JOIN ClassAdCat b ON b.ClassAdCatID = a.ClassAdCatID
    INNER JOIN Member d ON d.MemberID = a.MemberID
    INNER JOIN Region e ON e.RegionID = a.RegionID
    WHERE DATEDIFF(d, GETDATE(), a.ExpirationDate) >= 0
    AND PostType <> 'CPN'
    ORDER BY a.CreateDate DESC

Я хочу показать только один из каждого GROUPID ... Как я могу настроить оператор для достижения этого, поскольку я теряюсь с DISTINCT, GROUP BY и т. Д...

Любая помощь будет оценена.

Большое спасибо,

Пол

Ответы [ 3 ]

2 голосов
/ 18 сентября 2011

Вы можете использовать ROW_NUMBER функцию для разбиения набора данных на основе значений GroupId таким образом: для каждого нового значения GroupId счетчик перезапускается с 1 и первой строки (с ROW_NUMBER = 1 ) является новейшей записью (a.CreateDate DESC). Затем мы фильтруем все записи, имеющие ROW_NUMBER = 1.

SELECT TOP 30 *
FROM
(
    SELECT
    a.ClassAdID,    -- 0
    a.AdTitle,      -- 1
    a.ClassAdCatID, -- 2
    b.ClassAdCat,   -- 3
    a.Img1,         -- 4
    e.Domain,       -- 5
    a.AdText,       -- 6
    a.RegionID,     -- 7
    a.IsEvent,      -- 8
    a.IsCoupon,     -- 9
    b.ParentID,     -- 10
    a.MemberID,     -- 11
    a.AdURL,        -- 12
    a.Location,     -- 13
    a.GroupID,      -- 14
    ROW_NUMBER() OVER(PARTITION BY a.GroupId ORDER BY a.CreateDate DESC) AS PseudoId
    FROM ClassAd a
    INNER JOIN ClassAdCat b ON b.ClassAdCatID = a.ClassAdCatID
    INNER JOIN Member d ON d.MemberID = a.MemberID
    INNER JOIN Region e ON e.RegionID = a.RegionID
    WHERE DATEDIFF(d, GETDATE(), a.ExpirationDate) >= 0
    AND PostType <> 'CPN'
) q
WHERE q.PseudoId = 1;
1 голос
/ 17 сентября 2011

GROUP BY идет с функцией AGGREGATE ... это означает, что вы хотите сложить значения в группе или найти самые большие или самые маленькие в группе и т. Д.

DISTINCT удалит дублирующиеся строки.

в вашем запросе, возможно, вы получаете кучу не очень похожих строк, которые все имеют одинаковый group_id ... если это так, то вам нужно решить, какую из этих строк вы действительнохотите увидеть.

может быть, вам нужен самый новый или тот, который имеет самое длинное имя, или что-то в этом роде.

для группировки, вы должны выбрать столбец, например, созданный и сказать что-то вродеMAX (созданный) в списке выбора, затем группируйте все остальные столбцы в списке выбора, чтобы найти строки, которые соответствуют друг другу (кроме созданных в), и возвращайте их только один раз с наибольшим значением для созданного в ... hopeэто имеет смысл.

edit:

очень простой пример для идентификатора группы и даты создания.(вы можете добавлять новые столбцы по мере необходимости - по одному в группе по списку для каждого в списке выбора:

SELECT groupid, max( createdate )
FROM ClassAd
GROUP BY groupId
0 голосов
/ 17 сентября 2011

Если я правильно понимаю, вы хотите получить по одной строке от каждой группы (например, groupid)

Я использовал sql server 2005 (Nothwind)

SELECT   TOP 30  Customers.CompanyName, Orders.ShipCity, Orders.Freight
FROM         Customers INNER JOIN
                      Orders ON Customers.CustomerID = Orders.CustomerID
GROUP BY Customers.CompanyName, Orders.ShipCity, Orders.Freight
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...