基于先前值分组的SQL Server开关
我有以下格式的订单信息表:基于先前值分组的SQL Server开关,sql,sql-server,Sql,Sql Server,我有以下格式的订单信息表: ╔══════════════╦══════╦════════════════╦═══════════╦═════════╦══════════╗ ║ Order Number ║ Line ║ Item ║ Warehouse ║ Carrier ║ Quantity ║ ╠══════════════╬══════╬════════════════╬═══════════╬═════════╬══════════╣ ║ 255
╔══════════════╦══════╦════════════════╦═══════════╦═════════╦══════════╗
║ Order Number ║ Line ║ Item ║ Warehouse ║ Carrier ║ Quantity ║
╠══════════════╬══════╬════════════════╬═══════════╬═════════╬══════════╣
║ 255 ║ 1 ║ STUFFED-ANIMAL ║ WH1 ║ UPS ║ 3 ║
║ 256 ║ 1 ║ BLOCKS ║ WH2 ║ FEDEX ║ 1 ║
║ 257 ║ 1 ║ DOLL ║ WH1 ║ UPS ║ 1 ║
║ 257 ║ 2 ║ DRESS ║ WH1 ║ UPS ║ 3 ║
║ 257 ║ 3 ║ SHOES ║ WH2 ║ UPS ║ 1 ║
║ 258 ║ 1 ║ CHAIR ║ WH3 ║ FEDEX ║ 1 ║
║ 258 ║ 2 ║ CHAIR ║ WH3 ║ UPS ║ 2 ║
╚══════════════╩══════╩════════════════╩═══════════╩═════════╩══════════╝
我试图以这样一种方式来查询它,即根据列的唯一组合将其划分为多个组
在我的示例中,我希望得到以下结果:
╔════════════════╦══════╦════════════════╦═══════════╦═════════╦══════════╗
║ Package-Number ║ Line ║ Item ║ Warehouse ║ Carrier ║ Quantity ║
╠════════════════╬══════╬════════════════╬═══════════╬═════════╬══════════╣
║ 255 ║ 1 ║ STUFFED-ANIMAL ║ WH1 ║ UPS ║ 3 ║
║ 256 ║ 1 ║ BLOCKS ║ WH2 ║ FEDEX ║ 1 ║
║ 257-1 ║ 1 ║ DOLL ║ WH1 ║ UPS ║ 1 ║
║ 257-1 ║ 2 ║ DRESS ║ WH1 ║ UPS ║ 3 ║
║ 257-2 ║ 3 ║ SHOES ║ WH2 ║ UPS ║ 1 ║
║ 258-1 ║ 1 ║ CHAIR ║ WH3 ║ FEDEX ║ 1 ║
║ 258-2 ║ 2 ║ CHAIR ║ WH3 ║ UPS ║ 2 ║
╚════════════════╩══════╩════════════════╩═══════════╩═════════╩══════════╝
要分解它,我想做以下几点:
如果订单号、仓库和承运商相同,则为一个“分区”。如果只有一个分区,则我们只保留订单号作为包裹号,否则将其分解为包裹。这些包由相同的一组相同的值进行编号,但现在有一个数字表示它是哪个包
我在搜索类似问题后发现,我正在研究使用(按分区…)上的row\u number(),但我不认为这正是我想要的
有人能给我指出正确的方向吗?这里有一个选项,使用densite\u Rank()
而不是Row\u Number()
示例
Select [Package-Number] = concat([Order Number]
,left(nullif(count(*) over (partition by [Order Number] ),1),0)
+dense_rank() over (partition by [Order Number],warehouse,carrier order by Line)*-1 )
,Line
,Item
,Warehouse
,Carrier
,Quantity
From YourTable
返回
这是一个棘手的问题。将count(distinct)
作为一个窗口函数会有所帮助。但是有一个方便的技巧,使用densite\u rank()
s的和
所以,我想这就是你想要的:
select (case when seqnum_asc + seqnum_desc - 1 > 1 -- more than 1 distinct value
then concat(ordernumber, '-', seqnum_asc)
else concat(ordernumber, '') -- just to convert the value to a string
end) as packagenumber,
t.*
FROM (select t.*,
dense_rank() over (partition by ordernumber order by warehouse, carrier) as seqnum_asc,
dense_rank() over (partition by ordernumber order by warehouse desc, carrier desc) as seqnum_desc
from mytable t
) t;
他是一把小提琴
注意:这并没有考虑到行号的顺序——因为您的问题根本没有提到这一点。如果您只想在每组中包含具有相同值的相邻行,那么请提出一个新问题,并提供适当的样本数据和所需的结果。257-1和257-1?我觉得行号正好是您需要的。@johncapelletti因为它们共享相同的订单号、仓库和承运人,所以它们应该是相同的包裹号。@user2827048:与订单号258
相关的两条记录都有相同的行号(1
),你能确认这是一个拼写错误吗?@GMB是的,那是一个拼写错误,我现在就改。就是这样!谢谢。我以前没听说过稠密的_rank()。