0

我正在尝试构建一个查询,该查询为我提供基于列的唯一记录。这是数据的简化样本:

version        first            last
a              joe              smith
b              jane             smith
c              biff             mcelroy
a              thad             dussledorf

我希望查询基于version(因此在本例中为 a、b 和 c 的 1 个实例)返回唯一记录。对于这些返回的行,应表示所有 3 列。所以理想的结果是:

version        first            last
a              joe              smith
b              jane             smith
c              biff             mcelroy
4

4 回答 4

1

假设您的数据库支持窗口函数,最好的方法是:

select t.*
from (select t.*, row_number() over (partition by version order by version) as seqnum
      from t
     ) t
where seqnum = 1

这会为每个版本选择一个任意的“第一”行。

于 2012-06-27T13:30:28.380 回答
0

我不确定这是否会有任何错误/问题:

select distinct version,
 (select top 1 [first] from tableName t1 where t1.version = t.version) as [first],
 (select top 1 [last] from tableName t1 where t1.version = t.version) as [last]
from tableName t

您可以在每个子查询中使用某种“按 xxx 排序”。

我不确定这两个子查询是否总是会带回相同的“顶级”记录......?

但这并不理想。您最好拥有一个记录 ID 或时间戳或其他可以使用的东西,然后您将使用不同的解决方案。

于 2012-06-27T13:16:46.737 回答
0

如果您不关心应该在多个版本中返回哪些唯一版本,您可以简单地使用 group by:

select version, first_name, last_name from table name group by version;
于 2012-06-27T13:37:36.530 回答
0

您的问题的答案取决于数据库。如果您使用的是 Oracle (pl/sql),那么您可以使用 Rank over 函数:

SELECT * FROM (SELECT version, first, last RANK() OVER (PARTITION BY version ORDER BY first) RANK FROM SomeTable) WHERE RANK = 1;

复制和粘贴此查询可能不起作用。因此,请阅读http://www.techonthenet.com/oracle/functions/rank.php以了解需要做什么。

于 2012-06-27T14:59:58.700 回答