2015-10-27 33 views
1

我要一些端口R代码里面到Hadoop的使用与帕拉或蜂巢具有类似SQL的查询。我的代码是基于这样一个问题:SQL查询来比较行值对值进行分组,与条件

R data table: compare row value to group values, with condition

我希望能够找到,对于每一行,与亚组1相同的ID以更便宜的价格的行数。

比方说,我有以下数据:

CREATE TABLE project 
(
    id int, 
    price int, 
    subgroup int 
); 

INSERT INTO project(id,price,subgroup) 
VALUES 
    (1, 10, 1), 
    (1, 10, 1), 
    (1, 12, 1), 
    (1, 15, 1), 
    (1, 8, 2), 
    (1, 11, 2), 
    (2, 9, 1), 
    (2, 12, 1), 
    (2, 14, 2), 
    (2, 18, 2); 

这里是输出我想有(新列便宜):

id price subgroup cheaper 
1 10  1   0 (because no row is cheaper in id 1 subgroup 1) 
1 10  1   0 (because no row is cheaper in id 1 subgroup 1) 
1 12  1   2 (rows 1 and 2 are cheaper) 
1 15  1   3 
1 8  2   0 (nobody is cheaper in id 1 and subgroup 1) 
1 11  2   2 
2 9  1   0 
2 12  1   1 
2 14  2   2 
2 18  2   2 

注意,我总是希望比较在分组1行的那些,甚至当行本身在亚组2

回答

2

您可以加入自己的表,使用LEF牛逼JOIN:

SELECT 
    p.id, 
    p.price, 
    p.subgroup, 
    COUNT(p2.id) 
FROM 
    project p LEFT JOIN project p2 
    ON p.id=p2.id AND p2.subgroup=1 AND p.price>p2.price 
GROUP BY 
    p.id, 
    p.price, 
    p.subgroup 
ORDER BY 
    p.id, p.subgroup 

计数(p2.id)将计算在加入并取得成功的所有行(并且取得了成功,其中还有更便宜的价格,同样的ID和子组1)。

唯一的问题是,你希望那两行:

1 10  1   0 
1 10  1   0 

但我的查询只会返回一个,因为我的ID,价格,和子组分组。如果您的项目表中有另一个唯一的ID,您也可以按该ID进行分组。请看小提琴here

或者你可以使用内联查询:

SELECT 
    p.id, 
    p.price, 
    p.subgroup, 
    (SELECT COUNT(*) 
    FROM project p2 
    WHERE p2.id=p.id AND p2.subgroup=1 AND p2.price<p.price) AS n 
FROM 
    project p 
+0

非常感谢你。我实际上有另一个我可以使用的唯一ID,所以这是完美的。 – tucson