【发布时间】:2017-11-24 03:17:43
【问题描述】:
我有下表和数据。
create table items
(
itemid int
,userid varchar(10)
,itemtype varchar(10)
,value varchar(10)
);
insert into items values (101,'usr1','CST','');
insert into items values (101,'usr1','GST','');
insert into items values (100,'usr1','Data','a25');
insert into items values (100,'usr1','GST','');
insert into items values (99,'usr3','Data','a50');
insert into items values (98,'usr3','CST','');
insert into items values (98,'usr3','GST','');
insert into items values (97,'usr3','CST','');
insert into items values (96,'usr3','Data','a25');
insert into items values (96,'usr3','GST','');
insert into items values (95,'usr3','Data','a50');
insert into items values (95,'usr3','GST','');
这是一个发票行表,其中包含项目中每一行的详细信息。某些发票行没有“数据”类型的行。对于这些记录,我们需要遍历表,通过匹配userid找到下一个最低的itemid,其中有'Data'值,取值并将其作为输出。
这是预期的输出 -
itemid,userid,itemtype,value
101,usr1,CST,a25
101,usr1,GST,a25
98,usr3,CST,a25
98,usr3,GST,a25
97,usr3,CST,a25
可以看出,itemid 101 从 itemid 100 获取值。类似地,itemid 的 98 和 97 从 itemid 96 获取值。
我编写了以下查询来获取所有不包含数据的发票 -
;with cte_groupdata
as
(
select itemid
,userid
,case
when itemtype = 'Data' then 1
else 0
end as rn
from items
group by itemid
,userid
,case
when itemtype = 'Data' then 1
else 0
end
)
,cte_validdata
as
(
select itemid
,userid
,count(*) as total
from cte_groupdata
group by itemid
,userid
)
select vld.itemid
,vld.userid
,it.itemtype
from cte_validdata vld
join items it
on vld.userid = it.userid
and vld.itemid = it.itemid
where vld.total = 1
and it.itemtype <> 'Data';
我收到了我需要进行处理的所需发票。我知道我需要编写一个相关的子查询。我只是无法理解如何提出条件。这是产品数据,我们无权创建 UDF 或程序。
【问题讨论】:
-
有什么帮助吗?我是否缺少更多信息?
标签: sql postgresql