35

我想同时使用 distinct & top ,我做到了

SELECT distinct TOP 10 * FROM TableA

但我仍然有一个重复的 PersonId 所以我很难做到:

SELECT distinct (personID) TOP 10 * FROM TableA 但是语法错误,所以我想知道是否有任何解决方案

谢谢,

4

11 回答 11

55

您正在使用 a SELECT *which 正在提取所有记录。如果您想使用真正的 DISTINCT 仅列出您想要接收不同值的列。如果您有多个列,则所有这些列组合起来构成一个不同的记录。

SELECT distinct TOP 10 personID 
FROM TableA

请注意,没有ORDER BYthis 将返回前 10 条记录,没有特定的顺序。每次运行查询时,结果都可能不同。

于 2013-03-18T14:28:28.587 回答
8

您似乎想要为不同的人提供 10 条随机记录。尝试这个:

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

不过,一般来说,在使用时,top您还应该使用 anorder by来指定“top”的含义。

于 2013-03-18T15:51:16.420 回答
4

如果您使用这样的查询,它很简单:

SELECT DISTINCT TOP 2 name FROM [ATTENDANCE] ; 

在上面的查询中,name是 column_name,[ATTENDANCE]是 table_name。

您也可以使用WHERE它来制作过滤条件。

于 2017-05-25T11:35:37.117 回答
2

从 tablea 示例 10 中选择不同的 personid

这适用于 teradata

于 2017-02-28T13:27:46.963 回答
1

也许你可以这样做:

SELECT TOP 10 t.* FROM (SELECT distinct personID FROM TableA) t

于 2021-06-28T09:36:38.970 回答
0

我看到这是一个老问题,但我可以提出一个更优雅的解决方案

SELECT personDetails.*
FROM
(
    SELECT      TOP (10)
                personID
                personID
    FROM        TableA
    GROUP BY    personID    --> use this instead of distinct
)   AS          distinctIds

OUTER APPLY
(
    SELECT  TOP (1) *       --> fetch only one result matching personID
    FROM    TableA
    WHERE   TableA.personId = distinctIds.personID
)   AS      personDetails

您可以使用 GROUP BY 代替 DISTINCT,并且可以将 OUTER APPLY 与 TOP(1) 一起使用以仅获取一个匹配结果。

于 2021-06-28T09:58:35.597 回答
0

几个选项:

1: SELECT TOP 10 personID FROM (SELECT distinct personID FROM TableA)

2: ;with cte as (SELECT distinct personID FROM TableA) SELECT top 10 personID FROM cte

3: ;with cte as (SELECT personID,row_count=row_number() over (partition by personID order by personID) FROM TableA) SELECT top 10 personID FROM cte where row_count=1

于 2021-03-26T16:02:07.230 回答
0

根据帖子标题,Matt Busche 的答案是正确的。
但是,如果从您的代码示例中可以看出,您的问题是拥有来自不同的前 10 个 personID 的所有记录字段,则可以将其用作子查询:

SELECT TableA.* 
FROM TableA
INNER JOIN (SELECT DISTINCT TOP 10 personID FROM TableA) AS B
ON TableA.ID = B.ID
于 2021-10-11T14:16:56.047 回答
-1

SELECT DISTINCT ta.personid FROM (SELECT TOP 10 * FROM TableA) ta

ta 是子查询的对象,使用 ta 对象我们可以区分值

于 2019-06-13T10:31:42.030 回答
-3

我修好了

select distinct  personid from (SELECT  TOP 10 * FROM TableA)
于 2013-03-18T15:23:12.200 回答
-3

如果目标是选择每个 personID 的前 1 条记录,则使用

select * from TableA group by personid

由于您正在执行“分组依据”,它将返回每一列,但会忽略(不显示)具有相同 personId 的任何其他行

于 2017-10-02T18:23:01.547 回答