【问题标题】:Trying to select multiple columns where one is unique尝试选择多个列,其中一个是唯一的
【发布时间】:2013-09-11 15:22:58
【问题描述】:

我正在尝试从其中一列是唯一的表中选择几列。 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  

我只想删除所有重复 b 的行。

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

【问题讨论】:

  • 你只想要前 4 列吗?
  • 不,我只是将它用于示例。
  • 我认为你的逻辑有缺陷(或者你的例子不是很好)如果他们也想要'e'列怎么办......应该从前两行中选择哪个值...... 5或 6
  • 请提供您正在寻找的确切结果。
  • 你关心你返回的多行中的哪一行?

标签: sql sql-server sql-server-2005


【解决方案1】:

试试这个

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

【讨论】:

  • 这很好用,谢谢。如果你不介意,你能解释一下为什么会这样吗?我无法想象发生了什么。
  • 宠物,内部查询对 [b] 列进行了分区,并给了我行号。例如 [No] [b] 1 2 2 2 3 2 1 5 1 7 而外部查询仅从 [No] 列中获取值 1。
【解决方案2】:

DISTINCT 试试看:

SELECT DISTINCT a, b, c, d
FROM myTable

【讨论】:

  • 选择不同的行,即所有行。 OP 似乎最多需要一行,每个 b 值。
  • @Laurence 你可能是对的,OP 没有说应该返回第 1 行和第 2 行中的哪一个。
【解决方案3】:

你还没有说如何为每个 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

【讨论】:

    【解决方案4】:

    如果您不在乎 BCDE 获得的值,只要它们适合该键,您可以按A分组:

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

    请注意,MAX() 将同样有效。某些 RDBMS 支持 FIRST() 聚合或类似的聚合,恰好在这些情况下,您并不关心您(来自特定人群)获得的价值。

    【讨论】:

    • 结果行不一定是原始表中的一行。
    • 正确。如果 OP 确实关心这一点,他需要指定他想在选择行时使用的规则。如果他不在乎,但他确实想要一行中的所有值,我认为 Harshil 的解决方案是最好的。
    【解决方案5】:

    这将返回您要查找的内容,但我认为您的示例存在缺陷,因为您无法确定返回 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
    

    【讨论】:

      【解决方案6】:

      您不能将DISTINCT 放在单个列上。你应该把它放在SELECT之后:

      SELECT DISTINCT a, b, c, d
      FROM mytable
      

      它返回您的示例表所需的结果。但是,如果您只需要从单个列中删除重复项(这是不可能的),您可能误解了一些东西。给我们更多的描述和示例,我们会努力引导您走向正确的方向。

      【讨论】:

      • 选择不同的行,即所有行。 OP 似乎最多需要一行,每个 b 值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多