sql—在符合select条件的行之前选择n行

f87krz0w  于 2021-05-27  发布在  Hadoop
关注(0)|答案(2)|浏览(529)

我有一个来自生产线的流程数据的大表,其中包含产品在hadoop数据池中创建过程中经历的许多步骤。在某些情况下,我很想在某个过程发生之前找出发生了什么。
我可以编写一个select查询,它返回与我可以识别的进程相对应的行,但是如何(并且应该)在满足实际select查询的行之前返回n行呢?
我想知道在sql/pyspark中是否有可能做这样的事情,在选择了一组更大的数据(其中包含我想要的信息)并使用python过滤掉我需要的位之后,我是否应该做,或者类似的事情是否应该在python中做。
表结构示例:

|Col 1 | Col 2 | Col 3| Col 4  |
|A     | 1     | One  | Date 1 |
|C     | 1     | Two  | Date 2 |
|B     | 1     | One  | Date 1 |
|C     | 2     | Two  | Date 2 |
|C     | 1     | Three| Date 3 |
|D     | 2     | Four | Date 1 |
|E     | 1     | Five | Date 5 |

SELECT * FROM Table1
WHERE COL 1 = "C" and COL 3 = "Three"
ORDER BY COL 4, Col 2

会退回什么

|Col 1 | Col 2 | Col 3| Col 4  |
|C     | 1     | Three| Date 3 |

我想要的是什么

|Col 1 | Col 2 | Col 3| Col 4  |
|C     | 1     | One  | Date 2 |
|C     | 2     | Two  | Date 2 |
|C     | 1     | Three| Date 3 |

大于n=2,但n应该是可变的。如果一个实现可以在sql中实现,我非常感兴趣的是,这是应该在sql中完成的,还是以后最好在代码中完成。我可以看到双方的论点,但需要一些外界的意见。
编辑:两种建议的方法似乎都依赖于我之前提供的结构,其中col2是一个递增的值。这是误导,因为我使用列2和数字作为虚拟值。我现在用两列更新了表,这两列显示了表的正确顺序。第一个是包含日期时间戳的列,第二个是包含整数的列。
该表是hadoop数据湖中的一个表,因此建议的解决方案应该提供可以在该环境中执行的sql。
编辑2:很明显,行本身不一定是连续的,所以我不想要最后n行,而是要最后n行也满足某个 predicate 。在上面的例子中, predicate 是col2=“c”。

3zwtqj6y

3zwtqj6y1#

您可以使用运行计数:

SELECT *
FROM (SELECT t1.*,
             SUM(CASE WHEN COL1 = 'D' AND COL2 = 'Three THEN 1 ELSE 0 END)  OVER (ORDER BY col2 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) as cnt_special
      FROM Table1 t1
WHERE cnt_special > 0;

或者,可以使用窗口函数来标识 col2 价值观。如果您希望偏移量是逻辑的(即基于 col2 )而不是物理(即行数):

SELECT *
FROM (SELECT t1.*,
             MAX(CASE WHEN COL1 = 'D' AND COL2 = 'Three THEN col2 END)  OVER (ORDER BY col2) as special_col2
      FROM Table1 t1
WHERE col2 <= special_col2 and col2 >= special_col2 - 2
jtjikinw

jtjikinw2#

你可以用 row_number() 功能如下:

Declare @n int = 3

SELECT *
FROM (
   select Col1,Col2,Col3,
          Row_Number() over (ORDER BY Col2 ASC) as RowOrder
   from table1
) x
where x.RowOrder <= @n

相关问题