在where子句之前获取行

时间:2018-11-07 08:27:38

标签: sql oracle select

我想获取

的值

我有一个名为slot_machine_history的表,它代表给定老虎机的所有移动(出售,新搬迁,破坏,暂停)。

我想在“ V”和“ V”运动标识的每个卖出运动之前获取行。因为我想获得该公司是该广告位的所有者,以及该广告位的新所有者

  slot_machine_code        movement_history       current_company
  612134                    'NEW'                   1
  612134                    'TRANSPORT'             1
  612134                    'TRANSPORT'             1
  612134                    'V'                     10  
  612134                    'TRANSPORT'             10
  612134                    'SUSPENDED'             10
 612134                 'V'                     14

我的SQL查询应该返回:

 612134                 'TRANSPORT'             1
 612134                 'V'                     10
 612134                 'SUSPENDED'             10
 612134                 'V'                     14

1 个答案:

答案 0 :(得分:2)

您需要一些明智的方法来为此排序行。希望您的桌子上的东西会随着机器进行的每个移动事件而递增,例如日期或计数器:

  movement_event slot_machine_code        movement_history       current_company
  1              612134                    'NEW'                   1
  2              612134                    'TRANSPORT'             1
  3              612134                    'TRANSPORT'             1
  4              612134                    'V'                     10  
  5              612134                    'TRANSPORT'             10
  6              612134                    'SUSPENDED'             10
  7              612134                    'V'                     14

然后您可以执行以下查询:

SELECT slot_machine_code, movement_history, current_company FROM
(
  SELECT t.*, LEAD(movement_history) OVER(PARTITION BY slot_machine_code ORDER BY movement_event ASC) as next_Movement_history
  FROM your_table t
) z
WHERE
  z.movement_history = 'V' OR z.next_movement_history = 'V'

如果没有任何列表示记录的写入顺序,那么您有点不满意。加一。

如果当前表恰好按插入顺序返回行,则足以使用该表添加行号或类似的行,但是很快就可以这样做,因为数据库返回行的顺序永远不能保证是插入顺序,并且内部数据重组将更改无序(没有ORDER BY子句)查询返回的行的顺序