【问题标题】:SQL Standard Value and VariationsSQL 标准值和变体
【发布时间】:2014-01-21 20:22:45
【问题描述】:

以下是数据示例

UnitID     ITEM_Num     Price  
13446      71079        45.57  
13447      71079        45.57  
13448      71079        52.50  
13449      71079        45.57  
13450      71079        36.22 

实际数据集大约有 100 个唯一的 UnitID 和 700 个唯一的 Item_Num 值。我正在尝试确定每个 Item_Num 的最常见价格,然后选择与该标准相差超过指定百分比的任何记录。

理想情况下,我们应该为每件商品设置一个标准价格值,但我们没有。找到最常见值的最佳方法是什么。还有一个功能可以快速对变化最大的项目进行排名是价格。

这是 SQL Server 2012。

【问题讨论】:

  • 按价格分组,按count(*) desc排序,limit 1什么的
  • 您在哪一部分遇到了问题?
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql sql-server-2012


【解决方案1】:

您可以使用 GROUP BY 语句:

SELECT Price, count(*) FROM my_table GROUP BY Price ORDER BY Price ASC

希望这会有所帮助!

【讨论】:

  • 是的,我修改了答案
【解决方案2】:

以下查询应该在 SQL Server 中工作。它应该以低于或高于最常见价格 10% 的价格返还每个 ITEM_Num。

;WITH cte AS (
  SELECT 
      RANK() OVER (PARTITION BY ITEM_Num ORDER BY COUNT(1) DESC) AS 'Rank'
  , ITEM_Num
  , Price     
  FROM Units
  GROUP BY ITEM_Num, Price 
)
SELECT u1.UnitID
,      u1.ITEM_Num
,      u1.Price
,      u2.Price AS 'most common price'
FROM Units u1
INNER JOIN cte AS u2
ON u2.ITEM_Num = u1.ITEM_Num
AND u2.Rank = 1
WHERE ABS(u1.Price - u2.Price) >=  (u2.Price * 0.1);

编辑:我在不了解您的 DBMS 的情况下编写了查询,使用 SQL Server 的排名功能可能会更有效。

编辑 2:http://sqlfiddle.com/#!6/74940/33

【讨论】:

  • 我的 DBMS 是 SQL 服务器。连接中的派生表只返回一个值。我理解这个概念,但语法不起作用。我应该以相同价格获得最多商品的价格,但我不是。我应该使用 over 和 Row_number 吗?
  • I am trying to determine the most common price for each Item_Num and then select any records that vary from that standard by more than a specified percent. 子查询检索最常见的价格。外部查询选择与标准相差超过指定百分比(在我的情况下为 10%)的任何记录。
  • 但它必须是每件商品最常见的价格,而不是整个数据集中最常见的价格。
  • 你是对的,我没有用 2 个不同的项目测试它。我使用 RANK() 更新了脚本并使用多个项目对其进行了测试。您可以查看我的 SQL Fiddle 示例。
【解决方案3】:
Create table #t(
UnitID int,

Item_Num int,
Price money
)

Insert into #t(Unitid, Item_Num, Price)
values(13446,      71079,        45.57 ),
(13447,      71079,        45.57), 
(13448,      71079,        52.50), 
(13449,      71079,        45.57),
(13450,      71079,        36.22)



;with cte as (
Select 
Unitid, Item_Num, Price, 
Row_Number() over ( partition by item_num order by price) rownum
from #t
) 

Select 
u.UnitID,
u.Item_Num,
u.Price,
U1.price as CommonPrice,
u.RowNum,
U.Price*0.1,
(u.price +(u.price*0.1)) as NewPrice
from cte as U
inner join #t u1 on u.item_num =u1.item_num

where u.rownum =1

【讨论】:

  • 这不会在每次价格变化时创建一组新的行号吗?我看不出它是如何对最常见的价格值进行排名的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多