找出相等的行集

时间:2018-08-20 21:13:29

标签: sql sql-server-2012 grouping

我在计划和计划明细的基础上有很多行,我想找出与其他明细相同的行集,例如计划1在明细表中有3行数据,因此需要为另一个计划找出相同的行。我的这篇文章中有一些示例数据可能对理解我的问题更有用。以下是示例数据图像,该数据将按记录分组,但不在基于完整行集的单行基础上 PlanId,MinCount,MaxCount和CurrencyId

enter image description here

我的预期数据低于 enter image description here

我曾尝试过一些冗长的过程,例如将所有数据追加到一行中,然后与其他数据进行比较,但这似乎很漫长的过程,并且要花很长时间才能存储100条记录,而实际数据库中大约有20000条记录所以不是一个好的解决方案,请建议我一些想法

2 个答案:

答案 0 :(得分:0)

在SQL Server中很难产生您想要的结果。最简单的方法需要两个级别的字符串连接:

with t as (
      select a.account_id, 
             stuff( (select '[' +
                            convert(varchar(255), staircount) + ',' +
                            convert(varchar(255), mincount) + ',' +
                            convert(varchar(255), maxcount) + ',' +
                            convert(varchar(255), currencyid) +
                            ']'
                     from t
                     where t.account_id = a.account_id
                     order by staircount
                     for xml path ('')
                    ), 1, 1, '') as details
      from  (select distinct account_id from t) a
     )
select d.details,
       stuff( (select cast(varchar(255), account_id) + ','
               from t
               where t.details = d.details
               for xml path ('')
              ), 1, 1, '') as accounts
from (select distinct details from t) d;

这不完全是您的输出,但是对于您的问题来说可能就足够了。

答案 1 :(得分:0)

通过使用STRING_AGG,这在MS Sql Server 2017中将是微不足道的。
但是在2012年,其中一种方法是使用FOR XML技巧。

    // Landing Page, ask for API Key

    app.get("/", function(req,res){
       res.render("landing.ejs"); 
    });

    app.get("/ui", function (req,res){


       var apiKey = apiKey,
           apiSecret = apiSecret;

       var verb = 'GET',
          path = '/api/v1/user/wallet?currency=XBt',
          expires = new Date().getTime() + (60 * 1000); 




    var signature = crypto.createHmac('sha256', apiSecret).update(verb + path + expires).digest('hex'); 

    var headers = {
  'content-type' : 'application/json',
  'Accept': 'application/json',
  'X-Requested-With': 'XMLHttpRequest',
  'api-expires': expires,
  'api-key': apiKey,
  'api-signature': signature
}; 
     const requestOptions = {
  headers: headers,
  url:'https://testnet.bitmex.com'+path,
  method: verb

};


 request(requestOptions, function(error, response, body) {
  if (error) { console.log(error); 

  } else{
  console.log(body);


   }

    });
    });

测试here