【问题标题】:Is there a way to find rows of a certain value based on the previous row?有没有办法根据前一行找到某个值的行?
【发布时间】:2023-02-09 01:13:11
【问题描述】:

我正在尝试在具有特定值的表行中搜索,但前一行也必须包含特定值。前任。

ID column1 column2
1 S Date
1 T Date
1 J Date
1 C Date
2 D Date
2 Q Date
2 L Date
2 J Date
2 C Date
3 L Date
3 T Date
3 T Date
3 C Date

当之前的状态为“T”时,我只想选择第 2 列中具有“C”状态的 ID。

是否有可能做到这一点?

【问题讨论】:

  • 我进行了非常彻底的搜索,但找不到这个问题的答案,因为我不确定我是否以正确的方式提问,所以我在这里问。抱歉,如果之前已经有人问过。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

从 Oracle 12 开始,您可以使用MATCH_RECOGNIZE

SELECT id, column1, column2
FROM   table_name
MATCH_RECOGNIZE (
  PARTITION BY id
  ORDER     BY something_that_orders_the_rows
  ALL ROWS PER MATCH
  PATTERN ( {- status_t -} status_c)
  DEFINE
    status_t AS column1 = 'T',
    status_c AS column1 = 'C'
);

或者,在早期版本中,您可以使用 LAG 分析函数:

SELECT id, column1, column2
FROM   (
  SELECT id, column1, column2,
         LAG(column1) OVER (PARTITION BY id ORDER BY something_that_orders_the_rows) AS prev_c1
  FROM   table_name t
)
WHERE  column1 = 'C'
AND    prev_c1 = 'T';

其中,对于样本数据:

CREATE TABLE table_name (ID, column1, column2, something_that_orders_the_rows) AS
SELECT 1, 'S', 'Date', 1 FROM DUAL UNION ALL
SELECT 1, 'T', 'Date', 2 FROM DUAL UNION ALL
SELECT 1, 'J', 'Date', 3 FROM DUAL UNION ALL
SELECT 1, 'C', 'Date', 4 FROM DUAL UNION ALL
SELECT 2, 'D', 'Date', 1 FROM DUAL UNION ALL
SELECT 2, 'Q', 'Date', 2 FROM DUAL UNION ALL
SELECT 2, 'L', 'Date', 3 FROM DUAL UNION ALL
SELECT 2, 'J', 'Date', 4 FROM DUAL UNION ALL
SELECT 2, 'C', 'Date', 5 FROM DUAL UNION ALL
SELECT 3, 'L', 'Date', 1 FROM DUAL UNION ALL
SELECT 3, 'T', 'Date', 2 FROM DUAL UNION ALL
SELECT 3, 'T', 'Date', 3 FROM DUAL UNION ALL
SELECT 3, 'C', 'Date', 4 FROM DUAL;

两种输出:

ID COLUMN1 COLUMN2
3 C Date

fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多