DISTINCT不适用于MSSQL中的SELECT查询

时间:2016-07-18 14:18:47

标签: sql sql-server distinct greatest-n-per-group

这里有发票明细表。 我需要所有值而不重复[invoiceno]。 我正在尝试

select distinct invoiceno,name,addr1,addr2,id from invoice_table;

结果:

invoiceno    name             addr1       addr2             id
2016718001  Severus Sanpe   7,Hogwards, Sevilee,USA 7451    5
2016718002  Severus Sanpe   7,Hogwards, Sevilee,USA 7451    8
2016718002  Severus Sanpe   7,Hogwards, Sevilee,USA 7451    9

我想要结果:

 invoiceno   name             addr1       addr2             id
2016718001  Severus Sanpe   7,Hogwards, Sevilee,USA 7451    5
2016718002  Severus Sanpe   7,Hogwards, Sevilee,USA 7451    8

id中没有SELECT的情况下工作正常。但我也需要这个。 怎么做?

5 个答案:

答案 0 :(得分:4)

如果您不希望invoiceno重复,那么典型的方法是使用row_number()

select iv.*
from (select iv.*, row_number() over (partition by invoiceno order by id desc) as seqnum
      from invoice_table iv
     ) iv
where seqnum = 1 ;

您误解了select distinct的工作原理。它适用于select列表中所有列(和表达式),包括id

答案 1 :(得分:3)

您可能希望使用MIN聚合函数进行GROUP BY查询:

select
  invoiceno, name, addr1, addr2, min(id) as id
from
  invoice_table
group by
  invoiceno, name, addr1, addr2

如果同一张发票可以有多个名称和/或地址,您可以使用以下内容:

select t.invoiceno, t.name, t.addr1, t.addr2, t.id
from
  invoice_table t inner join (select invoiceno, min(id) as min_id) m
  on t.invoiceno=m.invoiceno and t.id=m.min_id

这将为每个invoiceno返回第一个id(值最小的id)。

答案 2 :(得分:2)

您似乎每张发票只需要输入一次。 假设它是SQL Server 2008或更高版本

select * from (
select invoiceno,name,addr1,addr2,id, Row_number() over( partition by invoiceno order by invoiceno) RN from invoice_table
) a where Rn=1

答案 3 :(得分:0)

DISTINCT关键字适用于完整的结果集:invoiceno,name,addr1,addr2,id。第2行和第3行在id字段不同,因此它们将是不同的。

有两种选择:

  1. 跳过ID
  2. 使用子选择
  3. 预过滤ID-s

    显然,你可以跳过这样的id字段:

    select distinct invoiceno,name,addr1,addr2 from invoice_table;
    

    分组有点棘手:

    select invoiceno,name,addr1,addr2,id -- no distinct
    from invoice_table
    where id in (
        select min(id) from invoice_table
        group by invoiceno -- we have this group by + min instead of the distinct keyword
    )
    

    第二个可能会对您的表现产生负面影响,所以要小心。

答案 4 :(得分:0)

SELECT * FROM invoice_table其中ID IN( SELECT MIN(ID)FROM invoice_table
GROUP BY invoiceno,name,addr1,addr2)