Sql 为表中的3列应用行号
我有一张名为“Temp”的桌子Sql 为表中的3列应用行号,sql,sql-server,row-number,Sql,Sql Server,Row Number,我有一张名为“Temp”的桌子 ItemId JobId Status 1 11 Yes 1 12 No 1 12 Yes 1 13 Yes 2 12 Yes 2 12 Yes 2 11 No 2 13 Yes 2 13 No 2 13 Yes 我的预期输出是,需要根据值
ItemId JobId Status
1 11 Yes
1 12 No
1 12 Yes
1 13 Yes
2 12 Yes
2 12 Yes
2 11 No
2 13 Yes
2 13 No
2 13 Yes
我的预期输出是,需要根据值为这3列(ItemId、JobId、Status)设置序列
产出应为:
iID iSN JobId JobSN Status statusId
1 1 11 1 Yes 1
1 2 12 1 No 1
1 3 12 2 Yes 1
1 4 13 1 Yes 1
2 1 12 1 Yes 1
2 2 12 2 Yes 2
2 3 11 1 No 1
2 4 13 1 Yes 1
2 5 13 2 No 1
2 6 13 3 Yes 2
Here iSN needs to set based on ItemId
JobSN based on JobId->ItemId
StatusId based on Status->JobId->ItemId
我知道要在列上设置序列,需要使用ROW_NUMBER()over(partition[ColumnName])对列进行分区。
但是,我怎样才能申请获得预期的产出呢。有人能帮我吗
提前感谢 只有statusId列我不清楚。希望这是一个开始
SELECT ItemId
, ROW_NUMBER() OVER (PARTITION BY ItemID ORDER BY ItemID) AS iSN
, JobId
, ROW_NUMBER() OVER (PARTITION BY JobId, ItemID ORDER BY ItemId) AS iSN
, Status
FROM @T
ORDER BY ItemId
结果
+------+----+------+----+-------+
|ItemId|iSN |JobId |iSN |Status |
+------+----+------+----+-------+
|1 |1 |11 |1 |Yes
|1 |2 |12 |1 |No
|1 |3 |12 |2 |Yes
|1 |4 |13 |1 |Yes
|2 |1 |11 |1 |No
|2 |2 |12 |1 |Yes
|2 |3 |12 |2 |Yes
|2 |4 |13 |1 |Yes
|2 |5 |13 |2 |No
|2 |6 |13 |3 |Yes
+------+----+------+----+-------+
试试这个:
SELECT Itemid AS iID
, ROW_NUMBER() OVER (PARTITION BY ITEMID ORDER BY JobID, STATUS) AS iSN
, JobID
, ROW_NUMBER() OVER (PARTITION BY ITEMID,JobID ORDER BY JobID, STATUS) AS iSN
, Status
, ROW_NUMBER() OVER (PARTITION BY ITEMID,JobID,STATUS ORDER BY JobID, STATUS) AS statusid
FROM TEMP;
但你必须按照规则来决定顺序,以获得始终相同的结果:我的结果与你的结果略有不同)
假设您有一列可用于按行排序,则可以执行以下操作: 创建并填充样本表(请在以后的问题中保存此步骤) 查询:
SELECT ItemId As iID,
ROW_NUMBER() OVER(PARTITION BY ItemId ORDER BY id) As iSN,
JobId,
ROW_NUMBER() OVER(PARTITION BY JobId, ItemId ORDER BY id) As JobSN,
[Status],
ROW_NUMBER() OVER(PARTITION BY [Status],JobId, ItemId ORDER BY id) As statusId
FROM @T
ORDER BY id
结果:
iID iSN JobId JobSN Status statusId
1 1 11 1 Yes 1
1 2 12 1 No 1
1 3 12 2 Yes 1
1 4 13 1 Yes 1
2 1 12 1 Yes 1
2 2 12 2 Yes 2
2 3 11 1 No 1
2 4 13 1 Yes 1
2 5 13 2 No 1
2 6 13 3 Yes 2
你的结果毫无意义。请描述输出与输入的关系。似乎您已经知道该做什么,这里的问题是什么?您是否有任何列可用于order by子句?我感觉您不知道在关系数据库中,表是无序的行集。
SELECT ItemId As iID,
ROW_NUMBER() OVER(PARTITION BY ItemId ORDER BY id) As iSN,
JobId,
ROW_NUMBER() OVER(PARTITION BY JobId, ItemId ORDER BY id) As JobSN,
[Status],
ROW_NUMBER() OVER(PARTITION BY [Status],JobId, ItemId ORDER BY id) As statusId
FROM @T
ORDER BY id
iID iSN JobId JobSN Status statusId
1 1 11 1 Yes 1
1 2 12 1 No 1
1 3 12 2 Yes 1
1 4 13 1 Yes 1
2 1 12 1 Yes 1
2 2 12 2 Yes 2
2 3 11 1 No 1
2 4 13 1 Yes 1
2 5 13 2 No 1
2 6 13 3 Yes 2