sql - SQL Server 查询 distinct 不起作用 - 只选择唯一记录 - 并且只查看一列的唯一性
问题描述
我有这个查询,我从 SQL Server 数据库表中获取记录,该表存储了我们网站上的用户查看过的所有产品(ProductRecentlyViewed
表)。
我试图只选择具有唯一性的记录rv.productvariantid
(我希望它只返回用户查看过的每个产品变体之一)。
我曾尝试使用关键字DISTINCT
,但由于我还需要DateCreated
for 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
解决方案
首先,选择子查询中的所有记录,然后过滤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
只得到一个productid
rn=1
推荐阅读
- python - 如何在 Python 上转换为匈牙利语
- ios - Swift 将运算符与 RxSwift 框架中的 `withLatestFrom` 等功能相结合
- php - PHP:合并数组并添加键值
- java - 将持久化实体保留在事务之外
- angular - 读取刚刚写入的文件与 Ionic4 文件插件没有相同的数据
- javascript - svelte electron 中的 JS 文件中不能需要节点模块
- shapefile - Google 地球引擎:如何在使用云遮蔽和陆地遮蔽计算 NDVI 期间将形状文件用作感兴趣区域
- javascript - undefined 不是 React Native 中的对象(评估 'item.Title')
- javascript - 如何在页面加载时弹出模式
- python - boost::python: PyErr_Fetch 总是返回 NULL 回溯