【问题标题】:Select neighboring entries选择相邻条目
【发布时间】:2021-11-17 14:34:17
【问题描述】:

我有一张带有文字注释的表格。我的应用程序显示按 pinned_flag 然后按 note_date 排序的条目:

id | note_text | note_date | pinned_flag
----------------------------------------
1  | note1     | 01/04/2021 |  1 
----------------------------------------
3  | note2     | 01/02/2021 |  1 
----------------------------------------
5  | note3     | 01/05/2021 |  0 
----------------------------------------
4  | note4     | 01/03/2021 |  0 
----------------------------------------
2  | note5     | 01/01/2021 |  0
----------------------------------------

我需要选择下面的 1 条记录和给定 id 的记录上方的 1 条记录。 (对于条目 5,结果将是 3 和 4)我可以使用哪些查询来执行此操作?

【问题讨论】:

  • 您是否真的以这种DD/MM/YYYY 格式存储日期?
  • 当然不是。只是为了保持简单。

标签: sqlite android-sqlite union common-table-expression window-functions


【解决方案1】:

如果您的 SQLite 版本是 3.25.0+,您可以使用 ROW_NUMBER() 窗口函数:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY pinned_flag DESC, note_date DESC) rn 
    FROM tablename
)
SELECT id, note_text, note_date, pinned_flag
FROM cte
WHERE (SELECT rn FROM cte WHERE id = 5) IN (rn - 1, rn + 1); 

如果您不能使用窗口函数但您的 SQLite 版本是 3.15.0+,则可以使用 UNION ALLRow Values

WITH cte AS (SELECT * FROM tablename WHERE id = 5)
SELECT * FROM (
  SELECT * FROM tablename
  WHERE (pinned_flag, note_date) > (SELECT pinned_flag, note_date FROM cte)
  ORDER BY pinned_flag, note_date LIMIT 1
)
UNION ALL
SELECT * FROM (
  SELECT * FROM tablename
  WHERE (pinned_flag, note_date) < (SELECT pinned_flag, note_date FROM cte)
  ORDER BY pinned_flag DESC, note_date DESC LIMIT 1
);

对于以前的版本:

WITH cte AS (SELECT * FROM tablename WHERE id = 5)
SELECT * FROM (
  SELECT * FROM tablename
  WHERE pinned_flag > (SELECT pinned_flag FROM cte)
     OR (pinned_flag = (SELECT pinned_flag FROM cte) AND note_date > (SELECT note_date FROM cte))
  ORDER BY pinned_flag, note_date LIMIT 1
)
UNION ALL
SELECT * FROM (
  SELECT * FROM tablename
  WHERE pinned_flag < (SELECT pinned_flag FROM cte)
     OR (pinned_flag = (SELECT pinned_flag FROM cte) AND note_date < (SELECT note_date FROM cte))
  ORDER BY pinned_flag DESC, note_date DESC LIMIT 1
);

请参阅demo

【讨论】:

  • 感谢您的出色解决方案!效果很好?
猜你喜欢
  • 2013-09-02
  • 2011-10-16
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多