使用SQL查找将创建最大文件提取的数据集

时间:2015-03-18 15:59:47

标签: sql sql-server

我们正在测试新系统导入从旧系统导出的大型CSV文件的能力。我想在旧系统中创建最大的导出文件,所以我试图找到最客户的客户端。这本身并不难,但由于我要求最大的文件大小,我还需要考虑分配给他们的类别最多的客户。

CSV布局如下所示:

FIRST_NAME, LAST_NAME, EMAIL, CATEGORY|CATEGORY|..., DATE_ADDED

表结构如下所示,客户可以拥有一个到多个类别:

CUSTOMER        CUSTOMERCATEGORY       CATEGORY
--------        ----------------       --------
customerid      customerid             categoryid
firstname       categoryid             description     
lastname
email
clientid
dateadded

这会构建我的文件(对于客户端9999):

select firstname, 
    lastname, 
    emailaddress, 
    coalesce(LEFT(CategoryNames,LEN(CategoryNames) - 1),'') as categories, 
    date_added
from Customer r
  cross apply
   (Select cc.description + '|'
    FROM Category cc
    join CustomerCategory c on c.categoryid = cc.categoryid
    WHERE r.customerid = c.customerid
    For XML PATH('')) x (CategoryNames)
where r.ClientID = 9999

因此,为了获得一个非常大的文件,我找到了拥有最多客户的前20个客户端。然后,我查找分配给客户的类别最多的前20个客户端,并手动比较2个列表以找到可能具有最大列表的客户端。但是 - 事实证明这是不对的,因为只拥有最大客户列表但没有分配类别的客户实际上有一个更大的文件。

你怎么能找到拥有最大数据集的客户端?我需要测试新系统导入这些文件的能力,并且鉴于成千上万的客户,我不想为每个客户创建CSV,因为这需要太长时间。

2 个答案:

答案 0 :(得分:1)

会花太长时间吗?

select s = sum(len(firstname) + len(lastname) + len(emailaddress) +
       len(coalesce(LEFT(CategoryNames,LEN(CategoryNames) - 1),'')))
     , r.ClientID 
from Customer r
  cross apply
   (Select cc.description + '|'
    FROM Category cc
    join CustomerCategory c on c.categoryid = cc.categoryid
    WHERE r.customerid = c.customerid
    For XML PATH('')) x (CategoryNames)
group by r.ClientID
order by 1 desc

答案 1 :(得分:0)

使用类似的东西来确定哪个客户有更多类别

HAVING count(*) = (
    SELECT MAX(COUNT(*)) FROM CUSTOMERCATEGORY GROUP BY customerid)

你的问题是这样的

-- Select fields
select firstname, 
    lastname, 
    emailaddress, 
    coalesce(LEFT(CategoryNames,LEN(CategoryNames) - 1),'') as categories, 
    date_added 
  from Customer r join CUSTOMERCATEGORY cc on  r.customerid = cc.categoryid                          
  join Category c on cc.categoryid = c.categoryid

-- Filtering the results can do it
where customerid in 
    (select customerid from CUSTOMER  having count(curstomerid)=(select MAX(COUNT(*)) from CUSTOMERCATEGORY group by customerid )