sql—是否可以使用其他行扩展选择,以便每个组具有相同的行数?

pcrecxhr  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(268)

我想通过其他行扩展选择,例如,我有一个传入的数据集:
从sometable中选择*

|---------------------|------------------|
|          Type       |        Value     |
|---------------------|------------------|
|          1          |         null     |
|---------------------|------------------|
|          2          |         null     |
|---------------------|------------------|
|          2          |         null     |
|---------------------|------------------|
|          2          |         null     |
|---------------------|------------------|
|          3          |         null     |
|---------------------|------------------|
|          3          |         null     |
|---------------------|------------------|
|          4          |         null     |
|---------------------|------------------|

当type是组键时,我想将它扩展到每组3行

|---------------------|------------------|
|          Type       |        Value     |
|---------------------|------------------|
|          1          |         null     |
|---------------------|------------------|
|          1          |         null     |
|---------------------|------------------|
|          1          |         null     |
|---------------------|------------------|
|          2          |         null     |
|---------------------|------------------|
|          2          |         null     |
|---------------------|------------------|
|          2          |         null     |
|---------------------|------------------|
|          3          |         null     |
|---------------------|------------------|
|          3          |         null     |
|---------------------|------------------|
|          3          |         null     |
|---------------------|------------------|
|          4          |         null     |
|---------------------|------------------|
|          4          |         null     |
|---------------------|------------------|
|          4          |         null     |
|---------------------|------------------|
vsikbqxv

vsikbqxv1#

你可以用 cross apply . 假设没有类型已经有超过3行:

select ty.type, t.value
from (values (1), (2), (3)) v(n) cross join
     (select distinct type from t) ty left join
     (select t.*, row_number() over (partition by type order by value) as seqnum
      from t
     ) t
     on t.type = ty.type and t.seqnum = v.n
tf7tbtn2

tf7tbtn22#

这不是特别漂亮,但它做的工作。如果您有一个包含唯一类型的表,它的性能可能会更好,因为 DISTINCT 不需要:

WITH Types AS(
    SELECT DISTINCT
           ST.[Type],
           V.RN
    FROM dbo.SomeTable ST
         CROSS APPLY (VALUES(1),(2),(3))V(RN))
RNs AS(
    SELECT [Type],
           [Value],
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN --As it appears you have no unique ID in your table I use SELECT NULL
    FROM dbo.SomeTable)
SELECT T.[Type,
       R.[Value]
FROM Types T
     LEFT JOIN RNs R ON T.RN = R.RN;

相关问题