5

我有一个示例表如下。

ID     Name            Code     Address
----+---------------+--------+----------------
1   |  Sydney Hall  |  SH    |  11 Abc Street
2   |  Sydney Hall  |  SH    |  23 Abc Street
3   |  Main Hall    |  MH    |  74 Xyz Street
4   |  Odyssey Hall |  OH    |  133 AbZ Street
5   |  Odyssey Hall |  OH    |  28 Xyx Street

我想为这些不同的条目选择不同的代码条目以及 ID 和名称。对于上面的表格,我想得到以下信息(所以我忽略了建筑地址)。

ID     Name            Code   
----+---------------+--------+
1   |  Sydney Hall  |  SH
3   |  Main Hall    |  MH
4   |  Odyssey Hall |  OH

这可能是一个左连接,但我似乎无法将它正确组合在一起(特别是因为我从同一个表中选择数据)。有人对此有任何想法吗?谢谢。

4

5 回答 5

4

我看到大家都已经回答过了,但是为什么这么复杂呢?

SELECT 
MIN(ID) ID, 
MIN(NAME) NAME, 
CODE 
FROM TABLE 
GROUP BY CODE
于 2013-02-11T05:16:57.003 回答
2
SELECT * 
FROM [table_1] 
WHERE [ID] IN (SELECT Min([ID]) 
               FROM [table_1] 
               GROUP BY CODE
              )
于 2013-02-11T04:20:01.607 回答
2

有两种方法我会考虑这样做。一种是使用FIRST聚合函数(记录在这里)。语法有点混乱,但它应该可以完成工作

Select
  MIN(ID) keep (dense_rank first order by id) as id,
  MIN(NAME) keep (dense_rank first order by id) as name,
  CODE
FROM YOUR_TABLE
GROUP BY CODE

我建议的另一种替代方法是使用ROW_NUMBER@techdo 建议的函数,尽管我认为您需要从该答案中删除 NAME 列,而是使用:

SELECT * FROM(
  SELECT 
      ROW_NUMBER() over (partition by CODE order by ID) RNUM, 
      ID, 
      NAME, 
      CODE
    FROM YOUR_TABLE
  )x where RNUM=1;
于 2013-02-11T05:16:59.013 回答
0

请试试:

SELECT * FROM(
  SELECT 
      ROW_NUMBER() over (partition by NAME, CODE order by NAME, CODE) RNUM, 
      ID, 
      NAME, 
      CODE, 
      ADDRESS 
    FROM YourTABLE
  )x where RNUM=1;
于 2013-02-11T04:29:42.227 回答
0

你也可以使用这个:

SELECT ID, Name, Code  
FROM table 
WHERE ID IN (SELECT Max(ID) 
             FROM table 
             GROUP BY Code
            )
于 2013-02-11T04:51:18.933 回答