SQL只拉表中所有字段的前10条记录,仅按2列分组



我的SQL技能太弱,无法解决这个问题,但我很确定这是可能解决的。

为了简化-我有一个小表,有5列,让我们把它们标记为a, B, C, D, e。它是1000行。

我需要能够按列A和B分组,其中(E不为空,E <>")。那部分我可以做。

select T.A, T.B, count(*) as countAll
from TABLE T
where not T.E is null and T.E <> ''
group by T.A, T.B

但是,然后我需要能够得到每组的所有列([A-E])的前10行包含在这些参数中的每组。这就是我挣扎的地方。我需要看到的是为每个分组的前10条记录返回的表中的所有字段。

下面的代码看起来和我需要的非常相似,但是到目前为止我还不能编译它。我一定没有正确地使用PARTITION BY子句(以前从未使用过它)。https://stackoverflow.com/a/51527260/3536926

SELECT MemberID, ResNumber, pcode, MemberEmail, arrivaldate,
FROM (
SELECT MemberID, ResNumber, pcode, MemberEmail, arrivaldate,
ROW_NUMBER () OVER w AS RN
FROM sometable
WINDOW w AS (PARTITION BY MemberID ORDER BY ResNumber ASC)
) X
WHERE RN <= 2

也许我应该使用GROUP BY以外的东西,比如PARTITION BY,但我不熟悉这个?

我认为这可能只是一个语法错误。OVER子句的格式如下:

SELECT MemberID, ResNumber, pcode, MemberEmail, arrivaldate
FROM (
SELECT MemberID, ResNumber, pcode, MemberEmail, arrivaldate,
ROW_NUMBER() OVER (PARTITION BY MemberID ORDER BY ResNumber ASC) AS RN
FROM sometable
) X
WHERE RN <= 10

每组返回行的顺序重要吗?这是一个小麻烦,但可能会让你接近你想要的。

WITH cte_Stuff
AS (
SELECT t1.A, t1,B, t1.C, t1.D, t1.E, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowId --Returns a random set unless the ORDER BY is specified
FROM [TABLE] t1
INNER JOIN (
SELECT t2.A, t2.B, COUNT(*) as countAll
FROM [TABLE] t2
WHERE ISNULL(t2.E, '') <> ''
GROUP BY t2.A, t2.B
) x ON t1.A = t2.A
AND t1.B = t2.B
)
SELECT c.A, c.B, c.C, c.D, c.E
FROM cte_Stuff c
WHERE c.RowId <= 10

最新更新