仅获取数据库中的更改
Get only changes in the database
我在数据库中有一个按日期排序的视图如下:
date company_name share
25.7.2016 Apple 20
25.7.2016 Samsung 50
26.7.2016 Apple 20
26.7.2016 Samsung 50
27.7.2016 Apple 30
27.7.2016 Samsung 40
我需要做的是检查两个后续日期之间的数据是否相同。如果是,只显示第一个日期的数据。
在我的示例中,日期 25.7.2016 的数据与 26.7.2016 的数据相同,而日期 26.7.2016 的数据与前一个数据不同。
所以我需要我的视图看起来像:
date company_name share
25.7.2016 Apple 20
25.7.2016 Samsung 50
27.7.2016 Apple 30
27.7.2016 Samsung 40
我该怎么做?
既然你没有提到你正在使用哪个数据库,我给你一个伪代码的逻辑解决方案:
if previous company_name = company_name AND previous share = share
if true then nothing
这可以使用 window 函数 lag()
访问前一行的值来完成:
select date, company_name, share
from (
select date, company_name, share,
lag(share) over (partition by company_name order by date) as prev_share
from sometable
) x
where (prev_share is null or prev_share <> share)
order by date, company_name;
prev_share is null
是在结果中包含 "group"(=分区)的第一行所必需的。这也可以使用 lag() 函数的默认值来完成。
您没有说明您的 DBMS,但以上是适用于任何 modern DBMS
的标准 SQL
我在数据库中有一个按日期排序的视图如下:
date company_name share
25.7.2016 Apple 20
25.7.2016 Samsung 50
26.7.2016 Apple 20
26.7.2016 Samsung 50
27.7.2016 Apple 30
27.7.2016 Samsung 40
我需要做的是检查两个后续日期之间的数据是否相同。如果是,只显示第一个日期的数据。
在我的示例中,日期 25.7.2016 的数据与 26.7.2016 的数据相同,而日期 26.7.2016 的数据与前一个数据不同。
所以我需要我的视图看起来像:
date company_name share
25.7.2016 Apple 20
25.7.2016 Samsung 50
27.7.2016 Apple 30
27.7.2016 Samsung 40
我该怎么做?
既然你没有提到你正在使用哪个数据库,我给你一个伪代码的逻辑解决方案:
if previous company_name = company_name AND previous share = share
if true then nothing
这可以使用 window 函数 lag()
访问前一行的值来完成:
select date, company_name, share
from (
select date, company_name, share,
lag(share) over (partition by company_name order by date) as prev_share
from sometable
) x
where (prev_share is null or prev_share <> share)
order by date, company_name;
prev_share is null
是在结果中包含 "group"(=分区)的第一行所必需的。这也可以使用 lag() 函数的默认值来完成。
您没有说明您的 DBMS,但以上是适用于任何 modern DBMS
的标准 SQL