一个SQL谜题(找到第一个出现的列值)

dev*_*747 0 sql sql-server-2008-r2

CI有一个简单的方法,我可以找到第一次出现在列中具有特定值的行?例如,假设我有这两个表

Alphabet
A
B
C
D


Alphabet    Usage
A           Apple
B           Bat
D           Dog
A           Amateur
A           Arsenal
C           Cat
B           Ball
D           Drum
Run Code Online (Sandbox Code Playgroud)

在第一个表中选择所有内容以及在第二个表中首次使用它的简单方法是什么?

预期产出:

Alphabet    Usage
A           Apple
B           Bat
C           Cat
D           Dog
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 5

你应该可以申请row_number().但是,在使用时row_number,需要提供订单.

第一个示例使用了order by 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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.

如果您没有数字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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.

正如@Aaron在评论中指出的那样,使用此方法无法保证该顺序,并且行为可能会发生变化.

理想情况下,您应该使用排序类型的列来区分数据的第一次出现,即datetime,id等.由于表中的数据没有顺序,您可以使用 order by

  • +1,但我要小心 - 即使有*可能*我认为需要更明确地说明这里的排序不保证,任意,并且可能在统计数据更改,数据更改,升级,Service Pack,CU时更改行为,甚至服务重启或有人清空计划缓存...... (2认同)