1

我在从数据库中获取我需要的行时遇到问题。

问题很简单:我有一张包含客户数据的表格。现在我想向我的所有客户发送邮件(通过邮寄),但我只想将它发送到每个地址一次。因此,如果任何客户住在同一个地址(街道、号码、邮政编码、城市),我只想把信寄给住在那个地址的最年长的人。

我需要的字段是标题、姓氏、名字、街道、号码……(用于导出目的)。我尝试在地址字段上使用 group by,但随后出现错误,我需要在其他字段(名称,...)上使用聚合函数,我不想这样做...

有什么建议么?

4

4 回答 4

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我们首先获得最年长的人进入的那些。

于 2013-09-17T14:38:00.097 回答
0

您可以使用以下 SQL 构造:

select distinct ...

选择 distinct 将避免结果集中出现重复。您可以使用 select distinct 收集所有唯一地址,然后与电子邮件地址交叉引用

于 2013-09-17T14:36:14.503 回答
0

使用SELECT DISTINCT仅选择唯一地址

于 2013-09-17T14:36:48.847 回答
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;
于 2013-09-17T14:51:29.423 回答