首页 > 解决方案 > SQL Server 查询 distinct 不起作用 - 只选择唯一记录 - 并且只查看一列的唯一性

问题描述

我有这个查询,我从 SQL Server 数据库表中获取记录,该表存储了我们网站上的用户查看过的所有产品(ProductRecentlyViewed表)。

我试图只选择具有唯一性的记录rv.productvariantid(我希望它只返回用户查看过的每个产品变体之一)。

我曾尝试使用关键字DISTINCT,但由于我还需要DateCreatedfor the orderby 并且由于这在具有相同的记录之间是不同的rv.productvariantid,所以我不能使用DISTINCT.

我可以做些什么来获取用户查看过的 20 个最新的独特产品变体?这是我当前的 SQL 查询,它选择了用户查看过的所有产品变体——不幸的是,如果用户多次查看它们,它会多次显示它们。

SELECT TOP 20
    rv.productId,
    p.productNameNO as productName,
    picid,
    picurl,
    rv.productRecentlyViewedId,
    rv.dateCreated,
    rv.lang,
    rv.isUserLoggedIn,
    rv.userId,
    rv.productVariantId
FROM 
    ProductRecentlyViewed rv
INNER JOIN 
    Product AS p ON rv.productid = p.productid
LEFT JOIN 
    (SELECT 
         productid,
         picurl,
         picid,
         ROW_NUMBER() OVER (PARTITION BY productid ORDER BY isfrontpic DESC) rn
     FROM 
         productpic) c ON c.rn = 1
                       AND rv.productId = c.productId
WHERE 
    rv.lang = 'NO'
    AND rv.cookieId = CONVERT(uniqueidentifier, '1f102c74-278b-430e-8129-1261dfc7e2ac')
ORDER BY 
    rv.dateCreated

标签: sqlsql-server

解决方案


首先,选择子查询中的所有记录,然后过滤rn=1

SELECT TOP 20 q.*
  FROM (SELECT rv.productId,
               p.productNameNO as productName,
               picid,
               picurl,
               rv.productRecentlyViewedId,
               rv.dateCreated,
               rv.lang,
               rv.isUserLoggedIn,
               rv.userId,
               rv.productVariantId,
               pv.productVariantName,
               ROW_NUMBER() OVER(PARTITION BY rv.productid ORDER BY c.isfrontpic DESC) rn 
          FROM ProductRecentlyViewed rv
         INNER JOIN Product as p
            ON rv.productid = p.productid
          LEFT JOIN productpic c
            ON rv.productId = c.productId
          LEFT JOIN ProductVariant pv
            ON productVariantId = rv.productVariantId 
         WHERE rv.lang = 'NO'
           AND rv.cookieId = CONVERT(uniqueidentifier, '123')) q
 WHERE q.rn = 1
 ORDER BY q.dateCreated

分组由 执行,每组PARTITION BY productid只得到一个productidrn=1


推荐阅读