DISTINCT不适用于MSSQL中的SELECT查询
这是发票明细表。 我需要没有重复的[invoiceno]的所有值。 我正在努力DISTINCT不适用于MSSQL中的SELECT查询,sql,sql-server,distinct,greatest-n-per-group,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 Se
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
在SELECT中没有id时工作正常。但我也需要。
如何做到这一点?您可能需要一个具有最小聚合函数的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
select distinct invoiceno,name,addr1,addr2 from invoice_table;
这将返回第一个id,即每个invoiceno值最低的id。您可能需要一个带有最小聚合函数的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
select distinct invoiceno,name,addr1,addr2 from invoice_table;
这将返回第一个id,即每个invoiceno的最小值。如果不希望重复invoiceno,则典型的方法是使用行号:
您误解了select DISTINCE的工作原理。它适用于选择列表中的所有列和表达式,包括id。如果您不希望invoiceno重复,则典型的方法是使用行号:
您误解了select DISTINCE的工作原理。它适用于选择列表中的所有列和表达式,包括id。似乎每个发票只需要一个条目。 假设是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
似乎每个发票只需要一个条目。 假设是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
DISTINCT关键字适用于完整的结果集:invoiceno、name、addr1、addr2、id。第2行和第3行在id字段处不同,因此它们将是不同的
有两种选择:
跳过ID
带有子选择的预过滤器ID-s
显然,您可以像这样跳过id字段:
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
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
)
第二个可能会对您的性能产生负面影响,因此请小心。DISTINCT关键字适用于完整的结果集:invoiceno、name、addr1、addr2、id。第2行和第3行在id字段处不同,因此它们将是不同的
有两种选择:
跳过ID
带有子选择的预过滤器ID-s
显然,您可以像这样跳过id字段:
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
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
)
第二个问题可能会对您的性能产生负面影响,因此请小心处理。从ID所在的发票表中选择* 从发票表格中选择MINID
按发票编号、名称、地址1、地址2分组,从ID所在的发票表格中选择* 从发票表格中选择MINID
按发票编号、名称、addr1、addr2分组参见id,第三个条目的id为9。id列是不同的,这就是为什么它在整行上出现两次,因此它出现两次。该行是唯一的。您使用的是哪一个DBMS?请用您使用的数据库标记您的问题。请参阅id,第三个条目的id为9。id列是不同的,这就是为什么它会出现两次,因为它在整行上都有效,因此会出现两次。行是唯一的。您使用的是哪种DBMS?请用您使用的数据库标记您的问题。如果存在ID以外的其他差异,情况如何?你需要另一个技巧。如果除了ID之外还有其他差异,情况会怎样?你需要另一个技巧。