2012-11-04 9 views
7

は、私は次のクエリ私が火をたいている:それはGROUP BYを使用してSQLクエリ - DISTINCTとTOPを結合しますか?

Msg 145, Level 15, State 1, Line 1 
ORDER BY items must appear in the select list if SELECT DISTINCT is specified. 

は、私は、クエリを変更しようとしました:私はそれを発射するとき

SELECT DISTINCT TOP(5) fp.PostId FROM dbForumPosts fp 
LEFT JOIN dbForumEntry fe ON fp.PostId = fe.PostId 
Order by fe.Datemade DESC 

しかし、私はエラーを取得します代わりに、しかし、私は次のような問題があります。

Msg 8127, Level 16, State 1, Line 4 
Column "dbForumEntry.Datemade" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause. 

は、私が何をしたいですか:

これをフォーラムと考えてください。投稿(dbForumPosts)とエントリ(dbForumEntry)があります。投稿数は0件です。

私がしたいのは、最新のアクティビティ(最新の更新されたエントリを持つ投稿)を取得することです。

+0

どのDBMSを使用していますか? –

+0

SQL Server 2008 R2(MSSQL) –

+0

'PostId'ごとに複数の' Datemade 'がありますか?もしそうであれば、注文のためにどれを使用するのですか? –

答えて

5

DatemadePostIdで、row_numberであることがわかります。そして、あなたは、最新の5件の記事を検索することができます:ID列(例えばForumEntryId)が

select top 5 PostId 
from (
     select PostId 
     ,  max(Datemade) as LastDate 
     from dbForumEntry 
     group by 
       PostId 
     ) SubQueryAlias 
order by 
     LastDate desc 

dbForumEntry場合、クエリ:

select top 5 PostId 
from (
     select PostId 
     ,  Datemade 
     ,  row_number() over (partition by PostId 
        order by Datemade) as rn 
     from dbForumEntry 
     ) SubQueryAlias 
where rn = 1 -- Most recent row per PostId 
order by 
     Datemade desc 

また、あなたがgroup byサブクエリと同じ達成することができますこれほど良い結果が得られるかもしれません。データベースは、テーブル全体に対してrow_numberまたはmax(Datemade)をコンパイルせずにこれを実行できます。

select top 5 PostId 
from dbForumPosts fp 
where not exists -- No later entry for the same post exists 
     (
     select * 
     from dbForumPosts fp2 
     where fp2.PostId = fp.PostId 
       and fp2.ForumEntryId > fp.ForumEntryId 
     ) 
order by 
     Datemade desc 
+0

ありがとうございました - 本当に助けになりました:-)!ありがとう。 –