0

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

Alphabet
A
B
C
D


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

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

预期输出:

Alphabet    Usage
A           Apple
B           Bat
C           Cat
D           Dog
4

2 回答 2

5

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

第一个示例使用 order by,usage但问题是它不会按表中 first 的顺序,而是按字母顺序:

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 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

请参阅SQL Fiddle with Demo

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

理想情况下,您应该有排序类型的列,可以让您区分数据的第一次出现,即日期时间、id 等。由于表中的数据没有顺序,您可以使用以下方式应用顺序order by

于 2013-01-29T16:06:47.133 回答
2

你不能,除非你在第二张桌子上有一个订单。SQL 表本质上是无序的,因此您需要一个指定插入时间或自动递增 id 的列。

如果您碰巧在没有并行性的情况下运行 SQL Server,并且数据存储在单个文件中,或者如果第二个表中的数据适合一页,那么以下可能会起作用(但不能保证):

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))分配行号而不对数据进行排序。但是,这没有记录,也不能保证。

我强烈建议您向表中添加其他列,包括标识每一行的标识列。

于 2013-01-29T16:19:38.143 回答