0

CIは、列に特定の値を持つ行の最初の出現を見つけることができる簡単な方法がありますか?たとえば、これら2つのテーブルがあるとします。

Alphabet
A
B
C
D


Alphabet    Usage
A           Apple
B           Bat
D           Dog
A           Amateur
A           Arsenal
C           Cat
B           Ball
D           Drum

最初のテーブルのすべてを選択し、2番目のテーブルでそれを最初に使用する簡単な方法は何でしょうか?

期待される出力:

Alphabet    Usage
A           Apple
B           Bat
C           Cat
D           Dog
4

2 に答える 2

5

申請できるはずですrow_number()。ただし、使用するrow_number場合は、提供する必要のある注文があります。

この最初の例では順序を使用してusageいますが、問題は、表の最初の順序ではなく、アルファベット順になることです。

select alphabet, usage
from
(
  select t1.alphabet,
    t2.usage,
    row_number() over(partition by t1.alphabet order by t2.usage) rn
  from table1 t1
  inner join table2 t2
    on t1.alphabet = t2.alphabet
) src
where rn =1

SQL FiddlewithDemoを参照してください。

最初に入力した順序を保証する数値IDフィールドがない場合。次を使用できる場合があります。

select alphabet, usage
from
(
  select t1.alphabet,
    t2.usage,
    row_number() over(partition by t1.alphabet order by (select 1)) rn
  from table1 t1
  inner join table2 t2
    on t1.alphabet = t2.alphabet
) src
where rn =1

SQL FiddlewithDemoを参照してください。

@Aaronがコメントで指摘しているように、この方法を使用してもその順序は保証されず、動作が変わる可能性があります。

理想的には、データの最初の出現を区別できるソートタイプの列、つまり日時、IDなどが必要です。テーブル内のデータには順序がないため、次を使用して順序を適用します。order by

于 2013-01-29T16:06:47.133 に答える
2

2番目のテーブルに注文がない限り、できません。SQLテーブルは本質的に順序付けされていないため、挿入時刻または自動インクリメントIDを指定する列が必要になります。

並列処理なしでSQLServerを実行していて、データが1つのファイルに格納されている場合、または2番目のテーブルのデータが1ページに収まる場合は、おそらく次のように機能します(ただし保証はありません)。

select au.*
from (select au.Alphabet, min(seqnum) as minseqnum
      from (select au.*, row_number() over (order by (select NULL)) as seqnum
            from AlphabetUsage au
           ) au
      group by au.Alphabet
     ) ausum join
     (select au.*, row_number() over (order by (select NULL)) as seqnum
      from AlphabetUsage au
     ) au
     on ausum.seqnum = au.seqnum

SQL Serverでの私の経験でrow_number() over (order by (select NULL))は、データを並べ替えずに行番号を割り当てます。ただし、これは文書化されておらず、保証されていません。

各行を識別するためのID列など、テーブルに列を追加することを強くお勧めします。

于 2013-01-29T16:19:38.143 に答える