在SQL中,我需要一些帮助。 我有这样的查询
select sub.*
from(
select
distinct columnA,
case
when length ("columnA") > 16 then 'Org_ID'
when length ("columnA") <= 16 then 'non_Org_ID'
end as ColumnC,
columnB,
"ColumnD"
from Table1
where "ColumnD"::date = '2018-08-31 00:00:00'::date
UNION
select
distinct columnA,
case
when length ("columnA") > 16 then 'Org_ID'
when length ("columnA") <= 16 then 'non_Org_ID'
end as ColumnC,
columnB,
"ColumnD"
from Table1
where "ColumnD"::date = '2019-07-01 00:00:00'::date
) sub
order by sub.columnC
Result
Column A Column B Column C Column D
1 a
1 a
2 b
3 b
4 c
4 d
现在要得到结果,我需要应用这样的逻辑。如果在C列中的单元格1等于单元格2,并且在A列中的单元格1等于单元格2,则“ True”,否则为“ false”,然后移至下一个单元格。所需的结果是这样的
Column A Column B Column C Column D Column E
1 a True
1 a (blanks)
2 b False
3 b (blanks)
4 c True
4 d (blanks)
空白不是100%必需的。
谢谢
答案 0 :(得分:1)
当值都相同时,您似乎希望使用true
,否则要使用false
。使用窗口功能:
select t.*,
(case when min(a) over (partition by b) = max(a) over (partition by b)
then 'true' else 'false'
end) as flag
from t;
Here是db <>小提琴,表明它可以正常工作。
答案 1 :(得分:1)
您可以group by columna, columnb
获取相同的行并联接到表:
select t.*,
case g.counter when 1 then 'False' else 'True' end columnc
from tablename t inner join (
select columna, columnb, count(*) counter
from tablename
group by columna, columnb
)g on g.columna = t.columna and g.columnb = t.columnb
请参见demo。
结果:
> columna | columnb | columnc
> ------: | :------ | :------
> 1 | a | True
> 1 | a | True
> 2 | b | False
> 3 | b | False
> 4 | c | True
> 4 | c | True