【发布时间】:2019-07-17 07:36:22
【问题描述】:
我正在使用 postgresql 并应用窗口函数。以前我必须找到具有相同姓氏和地址(街道地址和城市)的第一个 gid,所以我只需将姓氏放在窗口函数中的 partition by 子句中。
但现在我需要找到第一个姓氏不同的 g_id。虽然地址相同,但我该怎么做?
这是我以前做的。
SELECT g_id as g_id,
First_value(g_id)
OVER (PARTITION BY lname,street_address , city ,
order by last_date DESC NULLS LAST )as c_id,
street_address as street_address FROM my table;
让我们说这是我的数据库
g_id | l_name | street_address | city | last_date
_________________________________________________
x1 | bar | abc road | khi | 11-6-19
x2 | bar | abc road | khi | 12-6-19
x3 | foo | abc road | khi | 19-6-19
x4 | harry | abc road | khi | 17-6-19
x5 | bar | xyz road | khi | 11-6-19
_________________________________________________
在之前的场景中: 因为如果我为第一行运行我的 c_id,它应该返回“x2”,因为它考虑了这些行:
_________________________________________________
g_id | l_name | street_address | city | last_date
_________________________________________________
x1 | bar | abc road | khi | 11-6-19
x2 | bar | abc road | khi | 12-6-19
_________________________________________________
并返回最新的 last_date 行。
我现在想要选择这些行(具有相同 street_address 和 city 但没有相同 l_name 的行):
g_id | l_name | street_address | city | last_date
_________________________________________________
x1 | bar | abc road | khi | 11-6-19
x3 | foo | abc road | khi | 19-6-19
x4 | harry | abc road | khi | 17-6-19
_________________________________________________
输出将是 x3。
我想以某种方式比较 last_name 列,如果它不等于 last name 的当前值,然后按地址字段进行分区。如果没有行满足条件 c_id 应该等于当前 g_id
【问题讨论】:
-
请添加一些示例数据和预期输出
-
11-6-19最新到12-6-19怎么样?你是说最早的吗? -
请注意我在 last_day 订购时使用了 DESC,我想要最近日期的大多数行。
-
“raod”是错字吗?如果你想取另一个街道名称,一个更不同的名字会很有用......我仍然不确定你的意思是“姓氏不一样”......你的样本对于强调这个恕我直言并不是很有用
-
是的 raod 是一个错字,让它可以是任何值。在窗口函数中,我想选择 l_name 与迭代器姓氏的当前值不同但相同 street_address 和 city 的行。
标签: postgresql