簡體   English   中英

可以在 case 語句中使用 count() 嗎?

[英]Can count() be used in case statement?

我已將數據從 csv 文件復制到表stage_table和列:

aid
a_name
addrid
addr1
addr2
city
pstate
country
postalcd
contactnumber
attendancekey
attendancedate
attendedyesno
action_indicator

當同一表中的aid存在不止一次時,我試圖將表中的action_indicator列設為“Y”(默認情況下,該列設置為“N”)。

我試過這個查詢但不起作用

update_address_query = ("update public.address set active_ind=case    
                         when count(aid)>1 then 'Y' end from address")    
cur.execute(update_address_query)

我收到錯誤如下:

psycopg2.errors.DuplicateAlias:多次指定表名“地址”

這可以通過其他方式糾正嗎?

此地址表中的列是

地址

地址1

地址2

城市

狀態

國家

郵政

聯系電話

active_indicator

示例輸出應如下所示:

99801,No-13 4rthcrossst,GandiNagar,Bangalore,Karnataka,India,456009,7800912345,N

99802,No-14 5thcrossst,NehruNagar,Hyderabad,Telangana,India,556001,6800612345,N

99803,No-15 6thcrossst,SardarNagar,Ahmedab​​ad,Gujarat,India,356009,9800912345,N

99804,No-16 7thcrossst,PatelNagar,Bangalore,Karnataka,India,456009,5800912345,N

99805,No-17 8thcrossst,AnnaNagar,Chennai,TamilNadu,India,456009,4800912345,N

99801,No-13 4rthcrossst,GandiNagar,Bangalore,Karnataka,India,456009,7800912345,Y

99802,No-14 5thcrossst,NehruNagar,Hyderabad,Telangana,India,556001,6800612345,Y

99803,No-15 6thcrossst,SardarNagar,Ahmedab​​ad,Gujarat,India,356009,9800912345,Y

99804,No-16 7thcrossst,PatelNagar,Bangalore,Karnataka,India,456009,5800912345,Y

99805,No-17 8thcrossst,AnnaNagar,Chennai,TamilNadu,India,456009,4800912345,Y

99801,No-13 4rthcrossst,GandiNagar,Bangalore,Karnataka,India,456009,7800912345,Y

99802,No-14 5thcrossst,NehruNagar,Hyderabad,Telangana,India,556001,6800612345,Y

99803,No-15 6thcrossst,SardarNagar,Ahmedab​​ad,Gujarat,India,356009,9800912345,Y

99804,No-16 7thcrossst,PatelNagar,Bangalore,Karnataka,India,456009,5800912345,Y

99805,No-17 8thcrossst,AnnaNagar,Chennai,TamilNadu,India,456009,4800912345,Y

如果我做對了,當且僅當表中同一行中的aid存在多次時,您才希望將active_ind設置為“Y”。 您可以使用相關子查詢來獲取count()

UPDATE public.address a1
       SET active_ind = CASE
                          WHEN (SELECT count(*)
                                       FROM public.address a2
                                       WHERE a2.aid = a1.aid) > 1 THEN
                            'Y'
                        END;

順便說一句:這是一個CASE表達式,而不是一個語句。


編輯:

如果您不想觸及其他行的active_ind ,您還可以在WHERE子句中添加這樣的子查詢。

UPDATE public.address a1
       SET active_ind = 'Y'
       WHERE (SELECT count(*)
                     FROM public.address a2
                     WHERE a2.aid = a1.aid) > 1;

考慮使用row_number()窗口函數

with sub as (
   select *, 
          row_number() over(partition by aid order by pk_id) AS rn  --- USE PRIMARY KEY
   from public.address
)

update public.address a
set active_ind = 'Y'
from sub
where a.pk_id = sub.pk_id        --- USE UNIQUE IDENTIFIER OR PRIMARY KEY
  and sub.rn > 1

在線演示

您的問題與您想要的輸出不符。 您的所有記錄都已更新,因為您的所有記錄都有關於aid重復項。 所以這種情況貌似是數據庫的設計問題。 如果您的 Postgres 版本小於 12(當前),您可以嘗試使用OIDS列來查找最舊的行並將它們標記為 'N' 作為active_indicator 其余的將標有“Y”。 代碼看起來像這樣:

UPDATE test_so SET active_indicator = 'Y';

UPDATE test_so SET active_indicator = 'N'
FROM (SELECT *, oid, row_number() over (partition by addrid order by oid) AS rank
        FROM test_so) a
WHERE a.rank = 1
AND test_so.oid = a.oid;

但是為此目的使用時間戳要好得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM