SQL选择具有唯一值的行

时间:2013-09-17 14:32:18

标签: sql

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

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

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

有什么建议吗?

4 个答案:

答案 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;