如何在Firebird中使用(PostgreSQL的DISTINCT ON)?

福克斯·文·谭

我有一个包含数据的TempTable:

------------------------------------
| KEY_1 | KEY 2 | NAME   | VALUE   |
------------------------------------
|     1 |  0001 | NAME 2 | VALUE 1 |
|     1 |  0002 | NAME 1 | VALUE 3 |
|     1 |  0003 | NAME 3 | VALUE 2 |
|     2 |  0001 | NAME 1 | VALUE 2 |
|     2 |  0001 | NAME 2 | VALUE 1 |
------------------------------------

我想获取以下数据:

------------------------------------
| KEY_1 | KEY 2 | NAME   | VALUE   |
------------------------------------
|     1 |  0001 | NAME 2 | VALUE 1 |
|     2 |  0001 | NAME 1 | VALUE 2 |
------------------------------------

在PostgreSQL中,我在查询中使用DISTINCT ON

SELECT DISTINCT ON (KEY_1) KEY_1, KEY_2, NAME, VALUE
FROM TempTable
ORDER BY KEY_1, KEY_2

在Firebird中,如何像上述数据一样获取数据?

托斯滕·凯特纳

PostgreSQLDISTINCT ON会在考虑该ORDER BY子句情况下,在每个所述组密钥的第一行在其他DBMS(包括更高版本的Firebird)中,您将使用ROW_NUMBER此功能。您可以按所需顺序对每个组键的行编号,并与编号#1在一起。

select key_1, key_2, name, value
from
(
  select key_1, key_2, name, value,
    row_number() over (partition by key_1 order by key_2) as rn
  from temptable
) numbered
where rn = 1
order by key_1, key_2;

在您的示例中,您有一个平局(key_1 = 2 / key_2 = 0001出现两次),并且DBMS任意选择行之一。(必须在其中扩展sortkeyDISTINCT ONROW_NUMBER决定选择哪一个。)如果要两行,即显示所有绑定的行,则可以使用RANK(或DENSE_RANK)而不是ROW_NUMBER,这DISTINCT ON是行不通的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章