编辑:很抱歉在此之前没有提到postgres 8.3实现。
我有一个四列的表,这是今天建立的表。
Source_IP, Destination_IP, user_type, ut_bool
user_type
列不断获取新条目,因此我想将其与历史条目表进行比较,以查看相关日期是否为新条目。 source_ip
,destination_Ip
可以被视为主键
10.1.1.2, 30.30.30.1, type1, 0
10.1.1.2, 30.30.30.1, type4, 1
10.1.1.2, 30.30.30.4, type5, 0
10.1.1.2, 30.30.30.4, type3, 0
10.1.1.2, 30.30.50.9, type2, 0
10.1.1.4, 30.30.30.4, type4, 0
10.1.1.4, 30.30.30.4, type3, 1
如果至少有一个source_ip, destination_ip
对在其旁边有一个1,那么我很难将一个1列返回给某一对(source_ip,destination_ip, user_type
)对的列,例如我想得到< / p>
10.1.1.2, 30.30.30.1, 1
10.1.1.2, 30.30.30.4, 0
10.1.1.4, 30.30.30.4, 1
我不确定如何正确使用exists语句。
如何修复以下查询?
select source_ip, destination_ip,
(
select
case when exists
(select true from table
where ut_bool =1)
then '1'
else '0' end
) as ut_new
from
table;
我的查询一直在返回,因为我没有正确使用exists语句:
10.1.1.2, 30.30.30.1, 0
10.1.1.2, 30.30.30.4, 0
10.1.1.4, 30.30.30.4, 0
答案 0 :(得分:3)
我建议修改你的SQL语句:
SELECT SOURCE_IP,
DESTINATION_IP,
CASE SUM(UT_BOOL)
WHEN 0
THEN 0
ELSE 1
END AS UT_NEW
FROM test_table_name
GROUP BY SOURCE_IP,
DESTINATION_IP;
在您的测试数据上执行返回:
10.1.1.2 30.30.50.9 0
10.1.1.2 30.30.30.1 1
10.1.1.2 30.30.30.4 0
10.1.1.4 30.30.30.4 1
测试并使用Oracle和Postgres
答案 1 :(得分:2)
SELECT Source_IP, Destination_IP
, MAX(ut_bool) As the_value
FROM ztable
GROUP BY Source_IP, Destination_IP
;