2014-01-21 3 views
0

Ниже приведен пример данныхSQL-Стандартное значение и вариации

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 уникальных UnitIDs и 700 уникальных значений Item_Num. Я пытаюсь определить наиболее общую цену для каждого Item_Num, а затем выбрать любые записи, которые отличаются от этого стандарта более чем на определенный процент.

В идеале у нас будет стандартная стоимость Цен для каждого товара, но мы этого не сделаем. Каков наилучший способ найти наиболее распространенное значение. Также есть функция, которая могла бы быстро ранжировать элементы с наибольшим изменением - Price.

Это SQL Server 2012.

+0

группа по цене, порядок по количеству (*) убывание, предел 1 или что-то – njzk2

+0

Какой роли вы возникли проблемы с? – RedFilter

+0

Какая СУБД вы используете? Postgres? Oracle? –

ответ

0

Вы можете использовать GROUP BY заявление:

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

Надеется, что это помогает!

+0

true, я пересмотрел ответ – Yani

0

Следующий запрос должен работать в SQL Server. Он должен вернуть каждый ITEM_Num с ценой на 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); 

EDIT: Я написал запрос, не зная вашу СУБД, вероятно, может быть более эффективным использованием ранжирования функций SQL Server.

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

+0

Моя СУБД - это SQL-сервер. Полученная таблица в соединении возвращает только одно значение. Я понимаю концепцию, но синтаксис не работает. Я должен получать цену с наивысшим количеством предметов с одинаковой ценой, но я не уверен. Должен ли я использовать over и Row_number? – Pete

+0

'Я пытаюсь определить наиболее общую цену для каждого Item_Num, а затем выбрать любые записи, которые отличаются от этого стандарта более чем на определенный процент.' Подзапрос извлекает наиболее распространенную цену. Внешний запрос выбирает любые записи, которые отличаются от стандарта более чем на определенный процент (в моем случае 10%). – JodyT

+0

Но это должна быть самая распространенная цена за элемент, а не самая общая цена всего набора данных. – Pete

0
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 
+0

Разве это не создавало бы новый набор рунинов каждый раз, когда цена изменилась? Я не вижу, как он оценивает наиболее распространенную цену. – Pete

Смежные вопросы