我在从数据库中获取我需要的行时遇到问题。
问题很简单:我有一张包含客户数据的表格。现在我想向我的所有客户发送邮件(通过邮寄),但我只想将它发送到每个地址一次。因此,如果任何客户住在同一个地址(街道、号码、邮政编码、城市),我只想把信寄给住在那个地址的最年长的人。
我需要的字段是标题、姓氏、名字、街道、号码……(用于导出目的)。我尝试在地址字段上使用 group by,但随后出现错误,我需要在其他字段(名称,...)上使用聚合函数,我不想这样做...
有什么建议么?
我在从数据库中获取我需要的行时遇到问题。
问题很简单:我有一张包含客户数据的表格。现在我想向我的所有客户发送邮件(通过邮寄),但我只想将它发送到每个地址一次。因此,如果任何客户住在同一个地址(街道、号码、邮政编码、城市),我只想把信寄给住在那个地址的最年长的人。
我需要的字段是标题、姓氏、名字、街道、号码……(用于导出目的)。我尝试在地址字段上使用 group by,但随后出现错误,我需要在其他字段(名称,...)上使用聚合函数,我不想这样做...
有什么建议么?
SELECT title
, last_name
, first_name
, address_line_1
, address_line_2
, etc
FROM (
SELECT title
, last_name
, first_name
, address_line_1
, address_line_2
, etc
, Row_Number() OVER (PARTITION BY address_line_1, address_line_2, etc ORDER BY date_of_birth ASC) As row_number
FROM your_table
) As all_duplicatified
WHERE row_num = 1
这给每一行一个行号。行号在每个分区(在这种情况下是我们的地址字段)上“重置”,并且数字的顺序由年龄(dob)确定。
因此,如果我们只显示row_num = 1
我们首先获得最年长的人进入的那些。
您可以使用以下 SQL 构造:
select distinct ...
选择 distinct 将避免结果集中出现重复。您可以使用 select distinct 收集所有唯一地址,然后与电子邮件地址交叉引用
使用SELECT DISTINCT仅选择唯一地址
以下是我在 Oracle 中执行此类操作的方法:
--Create testing table
CREATE TABLE UniqueValTest (
fname NVARCHAR2(100),
lname NVARCHAR2(100),
address NVARCHAR2(100),
city NVARCHAR2(50),
state NVARCHAR2(2),
zip NVARCHAR2(5),
age NUMBER,
recid NUMBER
);
--Create sample data
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('JOHN', 'SMITH', '123 MAIN ST', 'JAMESTOWN', 'LA', '12345', 28, 1);
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('JENNIFER', 'SMITH', '123 MAIN ST', 'JAMESTOWN', 'LA', '12345', 30, 2);
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('RACHEL', 'ALLEN', '225 MAIN ST', 'JAMESTOWN', 'LA', '12345', 25, 3);
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('JOSEPH', 'ALLEN', '225 MAIN ST', 'JAMESTOWN', 'LA', '12345', 25, 4);
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('MARK', 'MCBRIDE', '228 MAIN ST', 'JAMESTOWN', 'LA', '12345', 55, 5);
--Here's the real part, pulling the data with the dedupe and priority
CREATE TABLE TestDataPull AS
SELECT T.*, ROW_NUMBER() OVER (PARTITION BY lname, address, zip ORDER BY lname, address, zip, age DESC NULLS LAST) AS dupeid
FROM UNIQUEVALTEST T;
--Now you can easily select your data
SELECT fname, lname, address, city, state, zip FROM TestDataPull WHERE dupeid = 1;