sql - sql:具有属性的最后一行之后的第一行
问题描述
我想编写一个查询,该查询在具有给定属性的最后一行之后立即返回第一行(按 id 排序)。ID 可能不是连续的。
理想情况下,它看起来像这样:
...
JOIN (select max(id) id from my_table where CONDITION) m
JOIN (select min(id) from my_table where id > m.id) n
但是,我不能m
在第二个子选择中使用标识符。
可以在嵌套查询中使用嵌套查询,但有没有更简单的方法?
谢谢你。
解决方案
我不确定这是如何融入您的其余查询的,所以我使用了 CTE
WITH max_next AS (
SELECT r.id as max_id
,r.next_id
FROM (
SELECT m.id
,m.next_id
,ROW_NUMBER() OVER (ORDER BY m.id DESC) AS rn
FROM (
SELECT n.* -- to provide data to satisfy CONDITIONS
,LEAD(n.id) OVER(ORDER BY n.id) as next_id
FROM my_table AS n
) AS m
WHERE CONDITIONS
) AS r
WHERE r.rn = 1
)
我还将 n.* 缩小到 CONDITIONS 所需的列到 a,而不是隐含的,因为 * 会减慢编译时间(或历史上有),因为需要读取所有元数据以了解 ANY 中的列,虽然编译也可以修剪未使用的列,但如果您只询问您想要的内容,它会更快(在最好的情况下只是节省编译时间,更糟糕的情况是,当您只需要读取 x 列时它会读取所有数据)
并且借用 Gordon 解决方案,这ROW_NUMBER
部分可能会更简单
WITH max_next AS (
SELECT m.id
,m.next_id
--, plus what ever other things you want from m
FROM (
SELECT n.* -- to satisfy CONDITIONS needs
,LEAD(n.id) OVER(ORDER BY n.id) as next_id
FROM my_table AS n
) AS m
WHERE CONDITIONS
ORDER BY m.id DESC LIMIT 1
)
以@PIG 为例,
WITH my_table AS (
SELECT column1 AS id
,column2 AS con1
,column3 AS other
FROM VALUES (1,'a',123),(2,'b',234),(3,'a',345),(5,'b',456),(7,'a',567),(10,'c',678)
)
SELECT m.id
,m.next_id
,m.other
FROM (
SELECT n.* -- to satisfy CONDITIONS needs
,LEAD(n.id) OVER(ORDER BY n.id) as next_id
FROM my_table AS n
) AS m
WHERE m.con1 = 'b'
ORDER BY m.id DESC LIMIT 1;
给出5, 7, 456
最后'b'
一行和新行,以及 my_table 上用于娱乐目的的额外值(并在 Snowflake 上运行,这意味着我也修复了先前的 SQL。)
推荐阅读
- c# - 如何从复杂的 XML 文档结构中获取指定的 Node 值
- intellij-idea - 如何仅通过使用键盘而不是从网站复制将复选标记输入 IDEA?例如复选标记是 ✓ 或 ✗
- apache - 将 curl 请求转换为 php-curl - 收到不同的响应
- python - Python websockets 服务器和 websockets 客户端在运行这两个任务时使用 asyncio 断言错误
- python - 查找相关字段/遍历 Selenium 浏览器结果
- python - 返回一个 DataFrame 与另一个 DataFrame 中不同的行
- javascript - 用动画替换对象值
- ansible - Ansible `archive` 模块无需压缩即可存档
- php - CSV 导出打印完整的 HTML
- c# - Automapper 是否支持映射到自我和更平坦/在同一对象上执行映射