我有一个来自生产线的流程数据的大表,其中包含产品在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”。
2条答案
按热度按时间3zwtqj6y1#
您可以使用运行计数:
或者,可以使用窗口函数来标识
col2
价值观。如果您希望偏移量是逻辑的(即基于col2
)而不是物理(即行数):jtjikinw2#
你可以用
row_number()
功能如下: