Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DISTINCT不适用于MSSQL中的SELECT查询_Sql_Sql Server_Distinct_Greatest N Per Group - Fatal编程技术网

DISTINCT不适用于MSSQL中的SELECT查询

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

这是发票明细表。 我需要没有重复的[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
在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之外还有其他差异,情况会怎样?你需要另一个技巧。