我有两个问题,我已经完成了联合。工会给我的数据如下:
ID CATEGORY CURRENT_NEW ORDER VOLUME PRICE
-------------------------------------------------
1000 LIMIT CURRENT 10 100 50
1000 TARGET CURRENT 10 100 50
1000 LIMIT NEW 10 100 100
1000 TARGET NEW 10 100 100
现在我想要一个标志,用于检查相同ID,相同类别,相同订单和相同音量的PRICE是否相等。
这样做时,必须在current_new列上进行比较。例如:Current_New的价格= ID为1000的新值,类别为LIMIT,订单10和第100卷必须使用Price of Current_New =当前值进行检查,ID为1000,类别为LIMIT,订单10和第100卷。如果等于则设置为标志为1,否则为0。
有人可以帮我解决这个问题。我被困住了。
答案 0 :(得分:0)
有多种方法可以编写此查询。例如,您可以使用左连接根据您的条件查找完全匹配的行,如果与NEW
的行不匹配,则返回1,否则为0;
SELECT m.*, CASE WHEN comp.id IS NULL AND m.CURRENT_NEW='NEW'
THEN 1 ELSE 0 END CHECK_FLAG
FROM mytable m
LEFT JOIN mytable comp
ON m.CURRENT_NEW = 'NEW'
AND comp.CURRENT_NEW = 'CURRENT'
AND m.CATEGORY = comp.CATEGORY
AND m.[ORDER] = comp.[ORDER]
AND m.VOLUME = comp.VOLUME;
请注意,此查询假定每个NEW行只有一个CURRENT行匹配,否则会产生重复行。
另一种编写方法是使用NOT EXISTS,它只检查匹配行的存在并相应地返回值;
SELECT m.*, CASE WHEN CURRENT_NEW = 'NEW' AND NOT EXISTS (
SELECT 1 FROM mytable comp
WHERE comp.CURRENT_NEW = 'CURRENT'
AND m.CATEGORY = comp.CATEGORY
AND m.[ORDER] = comp.[ORDER]
AND m.VOLUME = comp.VOLUME
) THEN 1 ELSE 0 END CHECK_FLAG
FROM mytable m;
答案 1 :(得分:0)
如果我正确理解了问题,你可以使用窗口函数执行此操作:
select uq.*,
(case when max(case when current_new = 'current' then price end) over
(partition by id, category, order, volume)) =
max(case when current_new = 'new' then price end) over
(partition by id, category, order, volume))
then 1 else 0
end) as flag
from unionquery uq;