假设我有下面的数据
在没有UNION
的情况下,如何将这些数据与最小的id并排显示?
我正在考虑为具有相同用户代码的每个数据提供序列号,为每次迭代创建临时表,然后连接它们。
这里的代码
DROP TABLE #TEMP
CREATE TABLE #TEMP (
ID INT,
[data] INT,
usercode NVARCHAR(50),
RowNum INT
)
INSERT INTO #TEMP(ID, [data], UserCode, RowNum)
SELECT Id, ApplicationID, 'john', ROW_NUMBER() OVER (ORDER BY Usercode) RNum from UserApplicationAccess
这是插入的数据,因此我为每一行提供一个序列号,以便用id标记每个数据
select a.UserCode, a.RowNum Id_1, a.[data] data_1, b.RowNum Id_2, b.[data] data_2 from #TEMP a join #TEMP b on a.UserCode = b.UserCode
where a.RowNum = 1 and b.RowNum = 2
union
select a.UserCode, a.RowNum Id_1, a.[data] data_1, b.RowNum Id_2, b.[data] data_2 from #TEMP a join #TEMP b on a.UserCode = b.UserCode
where a.RowNum = 2 and b.RowNum = 3
这就是我如何查询得到我想要的数据,它的工作,但由于没有限制每个用户有多少数据,我认为这个查询是不够的。例如,这个数据只有3行,所以我只使用了两次union,但有用户有10个数据,所以我必须写9 union,等等。
3条答案
按热度按时间yrwegjxp1#
看起来你想把相邻的行转换成一个范围,所以如果每个用户代码有10行,你想生成9个输出行,每行都有当前和“下一个”ApplicationID值,你可以使用LEAD或LAG函数来完成。
根据该数据:
以下查询将生成所需的结果:
这将返回
over (partition by usercode order by id)
按照usercode
对数据进行分区,并按照ID
对数据进行排序,然后我们可以计算分区中的行号,并使用LAG
或LEAD
检索上一个或下一个值。LAG/LEAD
将在边缘处返回NULL,因此prev is not null
用于排除边缘对。kpbwa7wx2#
因为你要做的是为每个用户代码获取n-1行,你可以使用
LEAD()
来获取下一个值,当它为空时(即最后一行),可以省略它。例外的情况是,如果一个用户只有一行,你可以通过总是包含每个用户的第一行来避免这种情况。所以你最终会得到这样的结果:其中:
| 用户代码|识别码_1|数据_1|身份证_2|数据_2|
| - ------|- ------|- ------|- ------|- ------|
| 比尔|1个|五十五|零|零|
| 约翰|1个|三十四|第二章|五十二|
| 约翰|第二章|五十二|三个|五十五|
| 史蒂夫|1个|三十四|第二章|五十二|
| 史蒂夫|第二章|五十二|三个|五十五|
| 史蒂夫|三个|五十五|四个|五十六|
**一个
xa9qqrwz3#
看起来很简单,除非我忽略了什么,您希望显示按
id
排序的行-可能在同一个user code
中,然后显示应用程序ID、某个序列号、下一行的应用程序ID和加1的序列号,并且您不希望显示同一个usercode
中没有后继行的行。