[英]SQL Select First, Second, Third, Fourth ,Last
我有一個會員數據庫,其中有居住在同一地址的人數。 為了最大程度減少郵寄新聞通訊時的郵政支出,我想從數據庫中選擇唯一的地址,並將所有姓名添加在居住在同一地址的人的同一標簽上。 我在Members
表中具有的字段是Names
, AddressLine1
, AddressLine2
, Suburb
, State
, Postcode
。
我很高興創建一個新表,例如,如果需要, LastOfNames
可以使用其他名為FirstOfName
, SecondOfNames
, ThirdOfNames
, LastOfNames
字段。 我的數據庫中居住在同一地址的最大人數為5。
標簽上要求的輸出示例:
John Smith
Jane Smith
10 High Street
Beverly Hills, NSW 2000
非常感謝您的幫助,因為我對此有很多困難。
感謝堆,米卡
我認為您的理想目標是在一個復雜的查詢中最多包含五個名稱和一個地址。 該示例在PostgreSQL中。 您沒有指定數據庫,但我相信ORACLE和SQLServer中存在推論。 您將必須進行自己的改編。
它有點混亂,但可以。 簡而言之,您可以使用WINDOW函數對每個唯一地址的多個名稱進行排名。 使用WITH子句按等級隔離每個名稱。 左聯接為少於五個名稱的地址選擇名稱。
樣表:
DROP TABLE name_address;
CREATE TABLE name_address
(
first_name CHARACTER VARYING (50)
,last_name CHARACTER VARYING (50)
,addr_line1 CHARACTER VARYING (50)
,city CHARACTER VARYING (50)
,state CHARACTER VARYING (2)
,zip CHARACTER VARYING (5)
)
WITH (OIDS=TRUE);
ALTER TABLE name_address OWNER TO your_name_here;
樣本數據:
INSERT INTO name_address (first_name, last_name, addr_line1, city, state, zip) SELECT 'John', 'Smith', '10 High Street', 'Beverly Hills NSW 2000', 'CA', '90210';
INSERT INTO name_address (first_name, last_name, addr_line1, city, state, zip) SELECT 'Jane', 'Smith', '10 High Street', 'Beverly Hills NSW 2000', 'CA', '90210';
INSERT INTO name_address (first_name, last_name, addr_line1, city, state, zip) SELECT 'Jeff', 'Smith', '12 High Street', 'Beverly Hills NSW 2000', 'CA', '90210';
INSERT INTO name_address (first_name, last_name, addr_line1, city, state, zip) SELECT 'Jean', 'Smith', '12 High Street', 'Beverly Hills NSW 2000', 'CA', '90210';
INSERT INTO name_address (first_name, last_name, addr_line1, city, state, zip) SELECT 'Jenn', 'Smith', '12 High Street', 'Beverly Hills NSW 2000', 'CA', '90210';
INSERT INTO name_address (first_name, last_name, addr_line1, city, state, zip) SELECT 'Jack', 'Smith', '12 High Street', 'Beverly Hills NSW 2000', 'CA', '90210';
INSERT INTO name_address (first_name, last_name, addr_line1, city, state, zip) SELECT 'Josh', 'Smith', '12 High Street', 'Beverly Hills NSW 2000', 'CA', '90210';
解決方案:
WITH nr AS (SELECT DISTINCT first_name, last_name, addr_line1, city, state, zip, COUNT(*) OVER(PARTITION BY zip, state, city, addr_line1 ORDER BY zip, state, city, addr_line1, last_name, first_name) AS name_rank
FROM name_address
GROUP BY first_name, last_name, addr_line1, city, state, zip
ORDER BY zip, state, city, addr_line1, name_rank)
,n1 AS(SELECT nr.first_name, nr.last_name, nr.addr_line1, nr.city, nr.state, nr.zip
FROM nr
WHERE nr.name_rank = 1)
,n2 AS(SELECT nr.first_name, nr.last_name, nr.addr_line1, nr.city, nr.state, nr.zip
FROM nr
WHERE nr.name_rank = 2)
,n3 AS(SELECT nr.first_name, nr.last_name, nr.addr_line1, nr.city, nr.state, nr.zip
FROM nr
WHERE nr.name_rank = 3)
,n4 AS(SELECT nr.first_name, nr.last_name, nr.addr_line1, nr.city, nr.state, nr.zip
FROM nr
WHERE nr.name_rank = 4)
,n5 AS(SELECT nr.first_name, nr.last_name, nr.addr_line1, nr.city, nr.state, nr.zip
FROM nr
WHERE nr.name_rank = 5)
SELECT DISTINCT n1.first_name
, n1.last_name
, n2.first_name
, n2.last_name
, n3.first_name
, n3.last_name
, n4.first_name
, n4.last_name
, n5.first_name
, n5.last_name
, na.addr_line1
, na.city
, na.state
, na.zip
FROM name_address AS na
LEFT JOIN n1 ON n1.addr_line1 = na.addr_line1 AND n1.city = na.city AND n1.state = na.state AND n1.zip = na.zip
LEFT JOIN n2 ON n2.addr_line1 = na.addr_line1 AND n2.city = na.city AND n2.state = na.state AND n2.zip = na.zip
LEFT JOIN n3 ON n3.addr_line1 = na.addr_line1 AND n3.city = na.city AND n3.state = na.state AND n3.zip = na.zip
LEFT JOIN n4 ON n4.addr_line1 = na.addr_line1 AND n4.city = na.city AND n4.state = na.state AND n4.zip = na.zip
LEFT JOIN n5 ON n5.addr_line1 = na.addr_line1 AND n5.city = na.city AND n5.state = na.state AND n5.zip = na.zip;
這是最終的輸出:
“簡”;“史密斯”;“約翰”;“史密斯”;“”;“”“”“”“”“”;“”;“ 10高街”;“新南威爾士州比佛利山庄2000”;“ CA” ;“ 90210”“ Jack”;“ Smith”;“ Jean”;“ Smith”;“ Jeff”;“ Smith”;“ Jenn”;“ Smith”;“ Josh”;“ Smith”;“ 12 High Street”; “比佛利山庄NSW 2000”;“ CA”;“ 90210”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.