Sql 尝试选择一个唯一的多个列

Sql 尝试选择一个唯一的多个列,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我试图从一个表中选择几列,其中一列是唯一的。select语句如下所示: select a, distinct b, c, d from mytable 该表如下所示: | a | b | c | d | e |... |---|---|---|---|---| | 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 4 | 6 | 2 | 5 | 7 | 1 | 9 | 7 | 3 | 8 | 6 | 4 | 7 | 3 | 8 | 6 | 7

我试图从一个表中选择几列,其中一列是唯一的。select语句如下所示:

select a, distinct b, c, d  
from mytable
该表如下所示:

| a | b | c | d | e |...  
|---|---|---|---|---|   
| 1 | 2 | 3 | 4 | 5  
| 1 | 2 | 3 | 4 | 6  
| 2 | 5 | 7 | 1 | 9  
| 7 | 3 | 8 | 6 | 4  
| 7 | 3 | 8 | 6 | 7  
| a | b | c | d |  
|---|---|---|---|  
| 1 | 2 | 3 | 4  
| 2 | 5 | 7 | 1  
| 7 | 3 | 8 | 6  
因此,查询应返回如下内容:

| a | b | c | d | e |...  
|---|---|---|---|---|   
| 1 | 2 | 3 | 4 | 5  
| 1 | 2 | 3 | 4 | 6  
| 2 | 5 | 7 | 1 | 9  
| 7 | 3 | 8 | 6 | 4  
| 7 | 3 | 8 | 6 | 7  
| a | b | c | d |  
|---|---|---|---|  
| 1 | 2 | 3 | 4  
| 2 | 5 | 7 | 1  
| 7 | 3 | 8 | 6  
我只想删除b重复的所有行


编辑:对于在重复b值的情况下要选择哪一行,似乎有些混淆。我不在乎,因为a、c和d应该(但不能保证)相同。

您没有说过如何为每个b值选择一行,但这将为每个b值选择一行

Select
    a,
    b,
    c,
    d,
    e
From (
    Select
        a,
        b,
        c,
        d,
        e,
        row_number() over (partition by b order by b) rn
    From
        mytable
    ) x
Where
    x.rn = 1
试试这个

    SELECT * FROM (SELECT ROW_NUMBER() OVER (PARTITION BY b ORDER BY a) NO
,* FROM TableName) AS T1 WHERE NO = 1

我认为您的
DISTINCT
功能已接近成功,请尝试:

SELECT DISTINCT a, b, c, d
FROM myTable

不能将
独立的
放在单个列上。您应该将其放在
选择的后面:

SELECT DISTINCT a, b, c, d
FROM mytable
它将返回示例表所需的结果。但是,如果您只需要从单个列中删除重复项(这是不可能的),您可能误解了某些内容。给我们更多的描述和示例,我们会尝试引导您找到正确的方向。

如果您不关心
B
C
D
E
的值,只要它们适合该键,您可以按
A
进行分组:

 SELECT A, MIN(B), MIN(C), MIN(D), MIN(E)
 FROM MyTable
 GROUP BY A

请注意,
MAX()
也同样有效。一些RDBMS支持一个
FIRST()
聚合,或类似的聚合,适用于您不关心(从特定人群中)得到哪个值的情况。

这将返回您想要的值,但我认为您的示例是有缺陷的,因为对于
e
列中返回的值没有确定性

Create Table A1 (a int, b int, c int, d int, e int)

INSERT INTO A1 (a,b,c,d,e) VALUES (1,2,3,4,5)
INSERT INTO A1 (a,b,c,d,e) VALUES (1,2,3,4,6)
INSERT INTO A1 (a,b,c,d,e) VALUES (2,5,7,1,9)
INSERT INTO A1 (a,b,c,d,e) VALUES (7,3,8,6,4)
INSERT INTO A1 (a,b,c,d,e) VALUES (7,3,8,6,7)

SELECT * FROM A1

SELECT  a,b,c,d
FROM
(
    SELECT ROW_NUMBER() OVER (PARTITION BY b ORDER BY a) RowNum ,* 
    FROM A1 
) As InnerQuery WHERE RowNum = 1

你只想要前4列吗?不,我只是用它作为例子。我认为你的逻辑有缺陷(或者你的例子不是很好),如果他们也想要“e”列呢。。。它应该从前两行中选择哪个值。。。5或6请提供您正在查找的确切结果。您是否关心返回的多行中的哪一行?这将选择不同的行,即所有行。OP似乎希望每个b值最多有一行。这将选择不同的行,即所有行。OP似乎最多需要一行包含每个b值。@Laurence您可能是对的,OP没有说明应该返回第1行和第2行中的哪一行。结果行不一定是原始表中的一行。正确。如果OP确实关心这一点,那么他需要指定在选择行时要使用的规则。如果他不在乎,但他确实想要一行中的所有值,我认为Harshil的解决方案是最好的。这非常有效,谢谢。如果你不介意的话,你能解释一下为什么会这样吗?我很难想象发生了什么。Pet,内部查询完成了[b]列的分区,并给了我行号。例如[No][b]1 2 2 3 2 1 5 1 7和外部查询仅从[No]列获取值1。