I have a table on BigQuery with some information and need to create another table with aggregated information by name with columns that have values with some condition.
Here is an example of a table:
x
CREATE TABLE EMP (
ID INT,
NAME CHAR,
ORDER_ID INT,
VALUE INT
);
INSERT INTO EMP VALUES (7369,'SMITH',1,5);
INSERT INTO EMP VALUES (7499,'ALLEN',2,10);
INSERT INTO EMP VALUES (7521,'JONES',3,15);
INSERT INTO EMP VALUES (7566,'JONES',4,5);
INSERT INTO EMP VALUES (7568,'JONES',5,10);
Here is simple aggregate by name:
SELECT name as client_name, min(order_id) as f_order,
max(order_id) as l_order, sum(VALUE) as total_order_value
FROM emp
GROUP BY name
Output:
client_name|f_order|l_order|total_order_value
ALLEN |2 |2 |10
JONES |3 |5 |30
SMITH |1 |1 |5
And needs add one more column “f_order_value” which has value from column “VALUE”, when f_order=order_id:
client_name|f_order|l_order|total_order_value|f_order_value
ALLEN |2 |2 |10 |10
JONES |3 |5 |30 |15
SMITH |1 |1 |5 |5
So try create virtual table and works with it, but it doesnt work due to i don’t use any aggragations in code, also I do not fully understand how to use the virtual table:
with first_table as (SELECT name as client_name,
min(order_id) as f_order, max(order_id) as l_order,
sum(VALUE) as total_order_value
FROM emp
GROUP BY name)
select first_table.*, IF(f.f_order=e.order_id, o.VALUE,null) as
order_value from first_table f
join EMP e on f.client_name=e.name group by name
Error:
Star expansion expression references column site which is neither grouped nor aggregated at
Advertisement
Answer
I would go with (for BigQuery Standard SQL)
#standardSQL
SELECT name AS client_name,
ARRAY_AGG(STRUCT(order_id AS f_order, value AS f_order_value ) ORDER BY order_id LIMIT 1)[OFFSET(0)].*,
MAX(order_id) AS l_order,
SUM(VALUE) AS total_order_value
FROM `project.dataset.emp`
GROUP BY name
if to apply to sample data from your question – result is
Row client_name f_order f_order_value l_order total_order_value
1 ALLEN 2 10 2 10
2 JONES 3 15 5 30
3 SMITH 1 5 1 5