用于将行值与组值进行比较的SQL查询,具有条件

时间:2015-10-27 15:07:56

标签: mysql

我希望将一些R代码移植到Hadoop,以便与Impala或Hive一起使用类似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中也是如此。

1 个答案:

答案 0 :(得分:2)

您可以使用LEFT 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

count(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