SQL-用于在行之间划分值的函数

SQL-用于在行之间划分值的函数,sql,hive,hql,Sql,Hive,Hql,我通常不做数据库编程,所以我不知道如何做某些事情。但我有一个问题,我要拿一个项目,如果这个项目在同一个位置,但在不同的位置,将所述项目的价值除以两个位置之间的总和计数 以下是我的表格结构: LOCATION PLACEMENT VALUE COUNT ITEM 25 12345 100 10 55555 <---- 25 67890 100 20 55555 <---- 25

我通常不做数据库编程,所以我不知道如何做某些事情。但我有一个问题,我要拿一个项目,如果这个项目在同一个位置,但在不同的位置,将所述项目的价值除以两个位置之间的总和计数

以下是我的表格结构:

LOCATION   PLACEMENT   VALUE  COUNT   ITEM
25         12345        100    10      55555  <----
25         67890        100    20      55555  <----
25         11111        50      5      00000
25         22222        75      5      11111
位置放置值计数项

25 12345 100 10 55555可能有一种更有效的方法,但您可以通过两个步骤将项目计数相加,然后通过将其除以来创建新值

create table new as select
item, sum(count) as item_count
from old
group by item, location, placement;

create table new2 as select
a.*,
b.item_count,
a.count/b.item_count as new_count
from old a
left join new b
on a.item=b.item;

可能有一种更有效的方法,但您可以通过两个步骤将项目计数相加,然后通过将其除以来创建新值

create table new as select
item, sum(count) as item_count
from old
group by item, location, placement;

create table new2 as select
a.*,
b.item_count,
a.count/b.item_count as new_count
from old a
left join new b
on a.item=b.item;
输出

location placement value               count    item 
   25     12345    33.33333333333333    10      55555  
   25     67890    66.66666666666666    20      55555  
   25     11111    50.0                 5       00000
   25     22222    75.0                 5       11111
如果您输入相同的位置和不同的项目

LOCATION   PLACEMENT   VALUE  COUNT   ITEM
25         12345        100    10      55555  <----
25         12345        100    20      55555  <----
25         11111        50      5      00000
25         22222        75      5      11111
好的,如果您有其他要求,请告诉我

输出

location placement value               count    item 
   25     12345    33.33333333333333    10      55555  
   25     67890    66.66666666666666    20      55555  
   25     11111    50.0                 5       00000
   25     22222    75.0                 5       11111
如果您输入相同的位置和不同的项目

LOCATION   PLACEMENT   VALUE  COUNT   ITEM
25         12345        100    10      55555  <----
25         12345        100    20      55555  <----
25         11111        50      5      00000
25         22222        75      5      11111
好的,如果您还有其他要求,请告诉我。

您的样品表

SELECT * INTO #TEMP FROM
(
       SELECT 25 LOCATION,12345 PLACEMENT,100 VALUE  ,10 [COUNT], 55555 ITEM 
       UNION ALL
       SELECT 25 ,        67890 ,       100 ,   20,55555  
       UNION ALL
       SELECT 25 ,        11111 ,       50  ,    5,00000
       UNION ALL
       SELECT 25 ,        22222 ,       75  ,    5, 11111
)TAB
你的结果如下

SELECT *,
CAST(([COUNT]/CAST(SUM([COUNT]) OVER(PARTITION BY ITEM)AS NUMERIC(20,2)))*VALUE AS NUMERIC(20,1)) Result 
FROM #TEMP
您的样本表

SELECT * INTO #TEMP FROM
(
       SELECT 25 LOCATION,12345 PLACEMENT,100 VALUE  ,10 [COUNT], 55555 ITEM 
       UNION ALL
       SELECT 25 ,        67890 ,       100 ,   20,55555  
       UNION ALL
       SELECT 25 ,        11111 ,       50  ,    5,00000
       UNION ALL
       SELECT 25 ,        22222 ,       75  ,    5, 11111
)TAB
你的结果如下

SELECT *,
CAST(([COUNT]/CAST(SUM([COUNT]) OVER(PARTITION BY ITEM)AS NUMERIC(20,2)))*VALUE AS NUMERIC(20,1)) Result 
FROM #TEMP

第二行实际为20…对不起,我错了,但我不需要我需要根据具有相同项目的行之间的总计数除以100第二行实际为20…对不起,但是我不需要,我需要将总计数除以100,在具有相同项的行之间添加这个最初效果很好。不得不稍微调整一下。我注意到您在
计数和放置=2
的位置执行了此操作。我应该说有2个或更多。有没有方法对值列求和?当我尝试在计算周围放置一个求和函数时,我得到“尚未支持UDAF‘sum’的位置”。当您的计数和位置>2时,在这种情况下,您只需更改,当查询中的a.count>1和a.dist_placement>1时,它就会起作用。添加此函数最初效果很好。不得不稍微调整一下。我注意到您在
计数和放置=2
的位置执行了此操作。我应该说有2个或更多。有没有方法对值列求和?当我尝试在计算周围放置一个求和函数时,我得到“尚未支持UDAF‘sum’的位置”。当您的计数和位置>2时,在这种情况下,您只需更改,当查询中的a.count>1和a.dist_位置>1时,它将起作用。