Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL标准值和变化_Sql_Sql Server 2012 - Fatal编程技术网

SQL标准值和变化

SQL标准值和变化,sql,sql-server-2012,Sql,Sql Server 2012,下面是一个数据示例 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值。我试图确定每个项目

下面是一个数据示例

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值。我试图确定每个项目的最常见价格,然后选择与该标准相差超过指定百分比的任何记录

理想情况下,我们会为每件商品制定一个标准价格,但我们没有。找到最常见价值的最佳方法是什么。此外,还有一个功能,可以快速排列变化最大的项目是价格


这是SQL Server 2012

您可以使用GROUP BY语句:

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

希望这有帮助

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

;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:

按价格分组、按计数(*)描述、限制1或其他内容您遇到了什么问题?您使用的是哪种DBMS?博士后?Oracle?是的,我修改了答案我的DBMS是SQL server。联接中的派生表仅返回一个值。我理解这个概念,但语法不起作用。我应该得到的价格与最高计数的项目相同的价格,但我不是。我应该使用over和Row\u number吗?
我正在尝试确定每个项目的最常见价格,然后选择与该标准相差超过指定百分比的任何记录。
子查询检索最常见的价格。外部查询选择与标准相差超过指定百分比(在我的示例中为10%)的任何记录。但它必须是每项最常见的价格,而不是整个数据集最常见的价格。您是对的,我没有用两个不同的项测试它。我使用RANK()更新了脚本,并使用多个项目对其进行了测试。您可以看到我的SQLFiddle示例。这不是每次价格改变时都会创建一组新的行号吗?我看不出它是如何排列最常见的价格价值的。
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