如何解决Oracle SQL中的FIRST和LAST值
我在查询某些数据时遇到问题。我尝试从中提取数据的表是一个LOG表,我想在其中查看彼此相邻的值的变化(下面的示例)
表格:
+-----------+----+-------------+----------+------------+ | UNIQUE_ID | ID | NAME | CITY | DATE | +-----------+----+-------------+----------+------------+ | xa220 | 1 | John Smith | Berlin | 2020.05.01 | | xa195 | 1 | John Smith | Berlin | 2020.03.01 | | xa111 | 1 | John Smith | München | 2020.01.01 | | xa106 | 2 | James brown | Atlanta | 2018.04.04 | | xa100 | 2 | James brown | Boston | 2017.12.10 | | xa76 | 3 | Emily Wolf | Shanghai | 2016.11.03 | | xa20 | 3 | Emily Wolf | Shanghai | 2016.07.03 | | xa15 | 3 | Emily Wolf | Tokyo | 2014.02.22 | | xa12 | 3 | Emily Wolf | null | 2014.02.22 | +-----------+----+-------------+----------+------------+
所需结果:
+----+-------------+----------+---------------+ | ID | NAME | CITY | PREVIoUS_CITY | +----+-------------+----------+---------------+ | 1 | John Smith | Berlin | München | | 2 | James brown | Atlanta | Boston | | 3 | Emily Wolf | Shanghai | Tokyo | | 3 | Emily Wolf | Tokyo | null | +----+-------------+----------+---------------+
我一直在尝试使用FirsT和LAST值,但是无法获得理想的结果。
select distinct id,name,city,first_value(city) over (partition by id order by city) as prevIoUs_city from test
感谢您的帮助! 谢谢!
解决方法
使用LAG
函数获取上一个日期的城市,并仅显示当前城市和滞后结果不同的行:
WITH cte AS (
SELECT t.*,LAG(CITY,1,CITY) OVER (PARTITION BY ID ORDER BY "DATE") LAG_CITY
FROM yourTable t
)
SELECT ID,NAME,CITY,LAG_CITY AS PREVIOUS_CITY
FROM cte
WHERE
CITY <> LAG_CITY OR
CITY IS NULL AND LAG_CITY IS NOT NULL OR
CITY IS NOT NULL AND LAG_CITY IS NULL
ORDER BY
ID,"DATE" DESC;
Demo
对于LAG
的使用方式和检查其值的某些评论是必要的。我们在这里使用LAG
的三个参数版本。第二个参数表示要回顾的记录数,在这种情况下为1(默认值)。第三个参数表示如果每个ID
分区的给定记录为 first ,则使用默认值。在这种情况下,我们使用默认值作为相同的CITY
值。这意味着第一条记录将永远不会出现在结果集中。
对于上面的WHERE
子句,匹配记录是城市和滞后城市不同的记录,或其中两个是NULL
且其他不是NULL
。这是将NULL
城市和某些NULL
城市价值视为不同的逻辑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。