Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于先前值分组的SQL Server开关_Sql_Sql Server - Fatal编程技术网

基于先前值分组的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()。