SQL - 如何获取搜索到的元素之后和之前的元素?

问题描述 投票:0回答:1

我想查询我的表并指定一些偏移量以获取我找到的表之前和之后的行。

例如获取此结果集(指定偏移量 2):

  • 数据1
  • data 2 --> offset: 2 --> 所以这一行也被添加到我的结果集中
  • data 3 --> offset: 2 --> 所以这一行也被添加到我的结果集中
  • data 4 --> 这一行满足我的查询条件
  • data 5 --> offset: 2 --> 所以这一行也被添加到我的结果集中
  • data 6 --> offset: 2 --> 所以这一行也被添加到我的结果集中
  • 数据7

我已经尝试过 LAG/LEAD,但这只能让我获得下一行的一列,我需要一个功能,该功能基本上也将偏移行添加到结果集中。

编辑: 我的样本数据如下所示: 我得到的数据存储了纸板编号、时间戳(表示扫描纸板的时间)和生产线编号。所以基本上在我的表格中我有以下几列:

  • ID(自增,int)
  • Cardboard_Number (varchar)
  • 日期时间(日期时间)
  • 生产线_编号(整数)

基本上,我想搜索一个 Cardboard_Number,并获取该数字之前和之后指定的偏移量。

所以更新我前面的例子:

  • 2“1234”2024-03-23 17:01:01 1
  • 4“123”2024-03-24 17:01:01 1
  • 5“135”2024-03-25 09:01:01 2
  • 7“234”2024-03-25 11:01:01 1
  • 9“134”2024-03-25 13:01:01 2
  • 10“12345”2024-03-25 14:01:01 1
  • 11“12346”2024-03-25 17:01:01 2

因此,当指定例如偏移量 1 并搜索 Cardboard_Number“134”,我想获取 ID 为 5、9 和 11 的行,因为我想知道在我搜索的一个之前和之后扫描了哪个 cardboard_number per ProductionLine_Number

sql mariadb
1个回答
0
投票

问题的解决方案:

SET @offset = 1;
SET @cb_num = '134';
SET @rn = 0;

WITH CTE as
(
  SELECT *,
         ROW_NUMBER() 
         OVER(PARTITION BY PRODUCTIONLINE_NUMBER ORDER BY date_TIME ASC) as RN
  FROM table1
)
SELECT id 
FROM CTE
WHERE RN BETWEEN (@rn := (SELECT RN FROM CTE WHERE CARDBOARD_NUMBER = @cb_num)) - @offset 
AND (@rn + @offset) 
AND PRODUCTIONLINE_NUMBER = (SELECT 
                             PRODUCTIONLINE_NUMBER 
                             FROM CTE 
                             WHERE CARDBOARD_NUMBER = @cb_num)

dbfiddle 链接 - https://dbfiddle.uk/Cg251_2O

© www.soinside.com 2019 - 2024. All rights reserved.