Sql server 为客户提供顶级产品中的特定产品

Sql server 为客户提供顶级产品中的特定产品,sql-server,Sql Server,我有一个查询,可以得到这样一个客户的产品数量 SELECT top(4) count([Product]) as p , Product FROM CustomerProducts WHERE CustomerID = '123' GROUP BY Product ORDER BY p desc 这是有效的,会给我举个例子,也会给我举个例子 154 Bike 100 Truck 90 Tracktor 80 Buggy 现在我需要让所有拥有自行车

我有一个查询,可以得到这样一个客户的产品数量

SELECT top(4)
    count([Product]) as p
    , Product 
FROM CustomerProducts
WHERE CustomerID = '123'
GROUP BY Product
ORDER BY p desc
这是有效的,会给我举个例子,也会给我举个例子

   154 Bike
   100 Truck
   90  Tracktor
   80  Buggy
现在我需要让所有拥有自行车的客户进入前4名。我尝试用一个子查询来实现这一点,但没有成功

SELECT CustomerID
WHERE Product
EXISTS IN {customers top 4 products}
这是我试图实现的查询

您可以通过应用程序来实现,但是,如果它是一个大表,请不要在生产中运行类似的查询,因为这可能是一个非常繁重的查询

此外,未测试查询。但应该有效

SELECT cp.CustomerID
FROM CustomerProducts cp
CROSS APPLY (
    SELECT TOP 4 xp.Product, count(*)
    FROM CustomerProducts xp
    WHERE xp.CustomerId = cp.CustomerId
    GROUP BY xp.Product
    ORDER BY COUNT(*) DESC
) xrp
WHERE xrp.Product = 'Bike'

使用窗口功能:

SELECT
  CustomerId
FROM
  (
    SELECT
      CustomerID
     ,Product
     ,RANK() OVER (PARTITION BY CustomerId ORDER BY COUNT(*) DESC) AS ProductRank
    FROM
      CustomerProducts
    GROUP BY
      CustomerID
     ,Product
  ) ProductSummary
WHERE
  ProductRank <= 4
    AND Product = 'Bike'
您可能需要使用密集的排名,这取决于您想要如何定义前4名