如何从同一个表中选择特定单元格的行?
Posted
技术标签:
【中文标题】如何从同一个表中选择特定单元格的行?【英文标题】:How can i select rows for specific cells from same table? 【发布时间】:2021-01-12 08:53:26 【问题描述】:我有一张包含租户及其地址的表格。
一个租户可以有多个地址,并且每个地址可以出现多次(关闭、打开、修改)。 租户首先出现一个地址(first),之后他可以对第一个地址进行多次更改(关闭、打开、修改),或者他可以有其他地址(关闭、打开、修改)。
如何提取关闭第一个地址的日期。
问题来了。街道的名称并不完全像首地址。它的名称中可以包含 St.、Ave.。
表格如下所示:
id | Tenant | code | Street | Number | Date |
---|---|---|---|---|---|
1 | Alice | First | Abbey | 5 | 01.01.2021 |
2 | Alice | Modify | Abbey Ro. | 5 | 02.01.2021 |
3 | Alice | Open | Elm St | 3 | 02.01.2021 |
4 | Alice | Close | St. Abbey | 5 | 05.01.2021 |
5 | Bob | First | Fifth | 10 | 01.02.2021 |
6 | Bob | Open | Fifth Ave | 222 | 01.02.2021 |
7 | Bob | Close | Fifth Ave | 222 | 05.02.2021 |
8 | Bob | Close | Ave Fifth | 10 | 06.02.2021 |
预期的结果应该是这样的:
id | Tenant | CloseID | Street | Number | Date |
---|---|---|---|---|---|
1 | Alice | 4 | Abbey | 5 | 05.01.2021 |
2 | Bob | 8 | Fifth | 10 | 06.02.2021 |
我觉得答案就在那里,但我抓不到它 :) 提前感谢您的支持。
【问题讨论】:
ID列真的是表中的列吗? Bob 是如何获得 ID 2 的? 街道从5号变成8号?你需要在两个记录中保持平等 是具有自己 id 的结果表。实际上只是一个枚举(生成的数字或标准数字)。不一定要在那里:) 我不明白。为什么第 4 行不关闭第 3 行的地址? 完全是其他地址。我想举例说明一个租户可以拥有多个房屋并对其进行多项操作。在这种情况下,Alice 有 2 个家:Elm Street 3 和 Abbey Aley 5。首先是 Abbey 5,然后修改 Abey 5。之后打开 Elm 3 并关闭 Abbey 5。需要知道她/他何时关闭第一个 Home,在此cas 修道院 5 【参考方案1】:你需要在两个记录中都相等(第一个和关闭) 例如,如果您确定“数字”每次都相同,并且 id 用户是唯一的,您可以使用它
SELECT * FROM tenant WHERE Number = 10 AND Id = 5 AND code = "close"
但这只是一个示例,您可以将它与您的租户一起使用,因为您很容易遇到错误 例如,如果租户有多个相同号码的地址
如果您知道另一个词(st.、ave 等)在 Street 中的位置,您可以使用 %
例子
7 |鲍勃 |关闭 |第五大道 | 222 | 05.02.2021
sql:
SELECT * FROM tenant WHERE Number = 10 AND Street LIKE 'Fifth%' AND code = "close"
8 |鲍勃 |关闭 |第五大道 | 10 | 06.02.2021
sql:
SELECT * FROM tenant WHERE Number = 10 AND Street LIKE '%Fifth' AND code = "close"
否则你必须换桌子 例如,通过添加地址编号字段 指示地址是否是该人的第一、第二、第三等等。
【讨论】:
感谢您的快速回复。我必须为每个租户运行此选择,将他的第一个地址(街道和号码)与他的相同地址(街道和号码)进行比较,但使用 CLOSE 代码。 不客气 - 如果我能帮助您,请将此答案标记为正确并关闭此主题。 该表有大约 10000 条记录,有很多租户 :) 如果地址不一样我认为不可能,你应该添加一个连续的“地址id”字段,并确保用户“id”也是如此,以便创建一个while循环,每个当你给两个 id 添加 +1 时,考虑所有用户并将第一个地址的 id 与关闭的地址进行比较 租户可以有多个地址,但一个地址保持不变(名称和号码)除了后缀名称(即“ave”、“st”从街道名称开始或结束)。变化只是代码(打开、关闭等)和日期。从一个租户的多个地址中,只有一个地址包含“First”代码。【参考方案2】:我会这样做:
with cte as(
select tenant, code, street, number, date, row_number() over (partition by tenant order by date desc) as rank
from tenants
order by date desc
)
select * from cte where rank = 1;
【讨论】:
感谢您的快速回复。街道名称并不完全相同。我必须使用类似“'%StreetName%'”的东西 对于段落我使用两个返回。 这不是我想要的。结果基于日期,这并不总是正确的。但是正在提取一些东西,这比我迄今为止获得的要好得多。我必须将每个租户的第一个地址(街道和号码)与他的相同地址(街道和号码)进行比较,但使用 CLOSE 代码。谢谢。 我同意我确实误解了你的问题:)以上是关于如何从同一个表中选择特定单元格的行?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用JS / jQuery在HTML表中选择一个特定的单元格?
如何从一个带有动态单元格的表格切换到 3 个或更多不同的视图