我想同时使用 distinct & top ,我做到了
SELECT distinct TOP 10 * FROM TableA
但我仍然有一个重复的 PersonId 所以我很难做到:
SELECT distinct (personID) TOP 10 * FROM TableA
但是语法错误,所以我想知道是否有任何解决方案
谢谢,
我想同时使用 distinct & top ,我做到了
SELECT distinct TOP 10 * FROM TableA
但我仍然有一个重复的 PersonId 所以我很难做到:
SELECT distinct (personID) TOP 10 * FROM TableA
但是语法错误,所以我想知道是否有任何解决方案
谢谢,
您正在使用 a SELECT *
which 正在提取所有记录。如果您想使用真正的 DISTINCT 仅列出您想要接收不同值的列。如果您有多个列,则所有这些列组合起来构成一个不同的记录。
SELECT distinct TOP 10 personID
FROM TableA
请注意,没有ORDER BY
this 将返回前 10 条记录,没有特定的顺序。每次运行查询时,结果都可能不同。
您似乎想要为不同的人提供 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”的含义。
如果您使用这样的查询,它很简单:
SELECT DISTINCT TOP 2 name FROM [ATTENDANCE] ;
在上面的查询中,name
是 column_name,[ATTENDANCE]
是 table_name。
您也可以使用WHERE
它来制作过滤条件。
从 tablea 示例 10 中选择不同的 personid
这适用于 teradata
也许你可以这样做:
SELECT TOP 10 t.* FROM (SELECT distinct personID FROM TableA) t
我看到这是一个老问题,但我可以提出一个更优雅的解决方案:
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) 一起使用以仅获取一个匹配结果。
几个选项:
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
根据帖子标题,Matt Busche 的答案是正确的。
但是,如果从您的代码示例中可以看出,您的问题是拥有来自不同的前 10 个 personID 的所有记录字段,则可以将其用作子查询:
SELECT TableA.*
FROM TableA
INNER JOIN (SELECT DISTINCT TOP 10 personID FROM TableA) AS B
ON TableA.ID = B.ID
SELECT DISTINCT ta.personid FROM (SELECT TOP 10 * FROM TableA) ta
ta 是子查询的对象,使用 ta 对象我们可以区分值
我修好了
select distinct personid from (SELECT TOP 10 * FROM TableA)
如果目标是选择每个 personID 的前 1 条记录,则使用
select * from TableA group by personid
由于您正在执行“分组依据”,它将返回每一列,但会忽略(不显示)具有相同 personId 的任何其他行