2017-05-08 10 views
0

インクリメンタルな行番号を抜粋することなくタグを追跡するために、GoogleのゲームSEサイトで使用するDataExplorerのa queryを更新しようとしていました。結果に戻り値を読みやすくするためです。 this onethis oneのように、これらのユーザーのために働いていたように、これを行う方法についてはいくつか質問がありますが、私の状況ではうまくいかないようです。ROW_NUMBER()を使用してSELECTでインクリメンタルな "RowId"列を取得する方法

明確にするために、私はこのような何か希望:私はこれまでのところで作ってみた何

RowId | TagName | Count | Easy List Formatting 
---------------------------------------------- 
1  | Tag1 | 6  | 1. [tag:tag1] (6) 
2  | Tag2 | 6  | 1. [tag:tag2] (6) 
3  | Tag3 | 5  | 1. [tag:tag3] (5) 
4  | Tag4 | 5  | 1. [tag:tag4] (5) 

をこのです:

SELECT ROW_NUMBER() OVER(PARTITION BY TagInfo.[Count] ORDER BY TagInfo.TagName ASC) AS RowId, * 
FROM 
(
    SELECT 
    TagName, 
    [Count], 
    concat('1. [tag:',concat(TagName,concat('] (', concat([Count],')')))) AS [Easy List Formatting] 
    FROM Tags 
    LEFT JOIN Posts pe on pe.Id = Tags.ExcerptPostId 
    LEFT JOIN TagSynonyms on SourceTagName = Tags.TagName 
    WHERE coalesce(len(pe.Body),0) = 0 and ApprovalDate is null 
) AS TagInfo 
ORDER BY TagInfo.[Count] DESC, TagInfo.TagName 

これは私が欲しいものに近いものが得られ、かなりではありません。 RowId列はインクリメントされますが、Count列が変更されるとリセットされます(おそらくPARTITION BYのため)。しかし、PARTITION BYを削除すると、RowIdの列は乱数のようになります。

テーブルが構造化されているので、私が達成したいことは達成可能ですか?もしそうなら、SQLはどのようなものでしょうか?

フォークされたクエリにアクセスするには、this linkを使用できます。とにかく助けがあれば、私の変更前の元のクエリはhereです。

答えて

2

PARTITION BYを削除する必要があります。数字がランダムに表示される理由は、外部クエリのORDER BYROW_NUMBER()ORDER BYと異なるためです。それらを同じにするだけで済むので、シーケンスプロジェクトの出力は単調に増加する値になります。具体的に

:あなたはあなたの期待出力が得られますので、今

SELECT ROW_NUMBER() OVER (ORDER BY TagInfo.[Count] DESC, TagInfo.TagName) AS RowId, * 
FROM 
(
    ... 
) AS TagInfo 
ORDER BY TagInfo.[Count] DESC, TagInfo.TagName 

は、次の2つのORDER BY節の試合では、パーティショニング、およびされていません。

ROW_NUMBER()ORDER BYがあることは、技術的には実際には気にしません。最終結果セットと同じオーダーが必要です。その場合、あなたはROW_NUMBER()で無意味ORDER BY句を提供することにより、そのようなクエリエンジンをだますことができます。

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowId 

ブームは、やりました!

+0

パーフェクト。これはまさに私が後にしたものです。サブクエリも実行する必要がないように見えるので、私はそれをカットしました。 –

+1

私の更新を見てください。 – ErikE

関連する問題