sql-server - 如何在 SQL 中只保留频率最高的行
问题描述
我试图只保留频率最高的行。
例如:
Latte | 4.2 | 1015
Flat White | 4.2 | 423
Cappuccino | 4.2 | 329
这是我用来获取结果的查询:
SELECT DISTINCT
"TBL_ITEM"."ItemModName1",
("TBL_ITEM"."ItemPrice" / "TBL_ITEM"."Qty") as PricePerUnit,
Count (*) as Frequency
FROM
"dbo"."tbl_item" AS "TBL_ITEM"
WHERE (
"TBL_ITEM"."ItemPrice" > 0.0
AND "TBL_ITEM"."UnitPrice" > 0.0
AND "TBL_ITEM"."Type" = 1
AND "TBL_ITEM"."CheckDate" BETWEEN '20200421 00:00:00.000' AND '20200427 23:59:59.997'
)
GROUP BY
"TBL_ITEM"."ItemModName1",
("TBL_ITEM"."ItemPrice" / "TBL_ITEM"."Qty")
ORDER BY Count (*) DESC
解决方案
您可以使用ROW_NUMBER()
窗口功能来做到这一点:
SELECT ItemModName1, PricePerUnit, Frequency
FROM (
SELECT
"TBL_ITEM"."ItemModName1",
("TBL_ITEM"."ItemPrice" / "TBL_ITEM"."Qty") as PricePerUnit,
COUNT(*) as Frequency,
ROW_NUMBER() OVER (PARTITION BY "TBL_ITEM"."ItemModName1" ORDER BY COUNT(*) DESC) as rn
FROM "dbo"."tbl_item" AS "TBL_ITEM"
WHERE (
"TBL_ITEM"."ItemPrice" > 0.0
AND "TBL_ITEM"."UnitPrice" > 0.0
AND "TBL_ITEM"."Type" = 1
AND "TBL_ITEM"."CheckDate" BETWEEN '20200421 00:00:00.000' AND '20200427 23:59:59.997'
)
GROUP BY
"TBL_ITEM"."ItemModName1",
("TBL_ITEM"."ItemPrice" / "TBL_ITEM"."Qty")
) t
WHERE rn = 1
ORDER BY Frequency DESC
您不需要DISTINCT
,因为您使用 GROUP BY。
推荐阅读
- r - 将数据框从分类变量重塑为仅二进制变量
- python - 无法在 Windows 10 中安装 pyAudio(需要 Microsoft Visual c++ 14.0)错误
- python - 在 Visual Studio Code 中运行 Node.js,调用 python 脚本作为子进程并对其进行调试
- html - 正在添加颜色:#333333;到正文标签更改所有文本元素的默认颜色的正确方法?
- c# - 在 ASP.NET MVC 中更改 Doc、Docx 文件
- git - 将功能分支推送到远程存储库以与不同步的 master 合并
- python-3.x - hackerrank 生日蛋糕(我差点搞定,但出了点问题)
- ruby-on-rails - 错误:“不兼容的字符编码:ASCII-8BIT 和 UTF-8”和“UTF-8 中的无效字节序列”在 SQL Server 2008 R2 中创建记录 RoR 时
- php - 如何使用 PHPMailer 将多个文件附加到两个不同的电子邮件?
- html - Magento 2 - 更改核心代码 css/html 未反映在前端