我有一个包含数据的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 ON
并ROW_NUMBER
决定选择哪一个。)如果要两行,即显示所有绑定的行,则可以使用RANK
(或DENSE_RANK
)而不是ROW_NUMBER
,这DISTINCT ON
是行不通的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句