gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:58:09 25 4
gpt4 key购买 nike

我有一个带有数据的 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 中,如何获取上述数据?

最佳答案

PostgreSQL 的 DISTINCT 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 任意选择其中一行。 (你必须在 DISTINCT ONROW_NUMBER 中扩展排序键来决定选择哪一个。)如果你想要两行,即显示所有绑定(bind)的行,你会使用 RANK (或 DENSE_RANK )而不是 ROW_NUMBER ,这是 DISTINCT ON没有能力。

关于sql - 如何在 Firebird 中使用 DISTINCT ON(PostgreSQL 的)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com