我在从数据库中获取所需的行时遇到问题。
问题很简单:我有一张包含客户数据的表格。 现在我想向所有客户邮寄(通过邮寄),但我只想将其发送到每个地址一次。因此,如果任何客户住在同一地址(街道,号码,邮政编码,城市),我只想将信件寄给居住在该地址的最老的人。
我需要的字段是标题,姓氏,名字,街道,数字......(出于出口目的)。我尝试在地址字段上使用group by,但后来我得到了错误,我需要在其他字段(名称,...)上使用聚合函数,我不想这样做...
有什么建议吗?
答案 0 :(得分:2)
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
我们得到的那些最年长者首先进入的那些。
答案 1 :(得分:0)
您可以使用以下SQL构造:
select distinct ...
选择distinct将避免结果集中的重复。您可以使用select distinct来收集所有唯一地址,然后使用电子邮件地址进行交叉引用
答案 2 :(得分:0)
使用SELECT DISTINCT仅选择唯一地址
答案 3 :(得分:0)
以下是我在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;