1

我有两个查询。第一的:

SELECT TOP 10   NewsItemTitle
            ,   COUNT(1) AS CounterNews
FROM [ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY NewsItemTitle
ORDER BY CounterNews DESC

给我这个:

NewsItemTitle                                                        CounterNews
Afinan plan para casas con cuota de $180.000 por mes                      5
The Exploratoreum's STEM seller                                           4
Witnesses at Hasan trial describe carnage of Ft. Hood shootings.          2
U.S. returns to FIFA top 20 after two-year absence                        2
Sunnyvale: Police shoot and kill man; body of woman found inside house    1
...

而且,此外,我想在该查询中添加字段[NewsItemUrl][NewsItemPublisher]

SELECT  [NewsItemUrl]
    ,   [NewsItemPublisher]
FROM [ACTIVITY]

那么,我怎样才能将这 2 个查询合并为 1 个呢?

4

3 回答 3

3

试试这个——

SELECT TOP 10
      NewsItemTitle 
    , [NewsItemUrl] = MAX([NewsItemUrl])
    , [NewsItemPublisher] = MAX([NewsItemPublisher])
    , COUNT(1) AS CounterNews
FROM dbo.[ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY NewsItemTitle
ORDER BY CounterNews DESC

或这个 -

SELECT TOP 10
      NewsItemTitle 
    , [NewsItemUrl]
    , [NewsItemPublisher]
    , COUNT(1) AS CounterNews
FROM dbo.[ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY 
       NewsItemTitle 
    , [NewsItemUrl]
    , [NewsItemPublisher]
ORDER BY CounterNews DESC
于 2013-08-20T13:45:54.253 回答
2

如果我理解正确,您希望包含两个不属于GROUP BY. 这通常是不允许的,您要么必须将它们包含在 group by 中,要么以另一种方式聚合它们 (fe MIN/MAX/COUNT)。

但是你可以使用一个排名函数,比如ROW_NUMBER在 common-table-expression 中:

WITH CTE AS
(
    SELECT NewsItemTitle, 
           NewsItemUrl, NewsItemPublisher,
           CounterNews = COUNT(*) OVER (PARTITION BY NewsItemTitle),
           RN = ROW_NUMBER() OVER (PARTITION BY NewsItemTitle ORDER BY CounterNews DESC)
    FROM [ACTIVITY] 
    WHERE [UserLocation] = 'United States' 
)
SELECT TOP 10 * 
FROM CTE 
WHERE RN = 1

如您所见,该OVER子句也适用于聚合函数,例如COUNT允许在不使用GROUP BY.

于 2013-08-20T13:50:39.757 回答
2

我同意 Devart 的回答,但如果您不想按 NewsItemUrl 和 NewsItemPublisher 分组,这是您可以实现的另一种方式。

SELECT DISTINCT [NewsItemUrl]
     ,  [NewsItemPublisher]
    , TMP.NewsItemTitle
    , CounterNews
FROM [ACTIVITY] ACT
INNER JOIN 
(
SELECT TOP 10   NewsItemTitle
            ,   COUNT(1) AS CounterNews
FROM [ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY NewsItemTitle
ORDER BY CounterNews DESC
) TMP ON ACT.NewsItemTitle = TMP.NewsItemTitle
于 2013-08-20T14:08:43.967 回答