下面是BigQuery的標準SQL
#standardSQL
SELECT
Agent_name, Training_date,
ROUND(AVG(CASE WHEN date <= Training_date THEN Score END)) AS Avg_pre_training,
ROUND(AVG(CASE WHEN date > Training_date THEN Score END)) AS Avg_post_training
FROM (
SELECT
Agent_name, Score,
PARSE_DATE('%m/%d/%Y', date) AS date,
PARSE_DATE('%m/%d/%Y', Training_date) AS Training_date
FROM training JOIN agents
ON Name = Agent_name
)
GROUP BY Agent_name, Training_date
-- ORDER BY Agent_name, Training_date
您可以使用虛擬數據從你的例子有問題
#standardSQL
WITH agents AS (
SELECT 'Dan' AS Name, 81 AS Score, '10/1/2016' AS date UNION ALL
SELECT 'Brad', 35, '8/5/2016' UNION ALL
SELECT 'Allison', 92, '6/3/2016' UNION ALL
SELECT 'Cindy', 95, '8/12/2016' UNION ALL
SELECT 'Dan', 45, '7/16/2016' UNION ALL
SELECT 'Cindy', 77, '4/16/2016' UNION ALL
SELECT 'Allison', 59, '3/22/2016' UNION ALL
SELECT 'Brad', 55, '3/22/2016' UNION ALL
SELECT 'Allison', 70, '6/25/2016'
),
training AS (
SELECT 'Dan' AS Agent_name, '8/28/2016' AS Training_date UNION ALL
SELECT 'Brad', '4/15/2016' UNION ALL
SELECT 'Cindy', '3/3/2016' UNION ALL
SELECT 'Allison', '5/1/2016' UNION ALL
SELECT 'Allison', '6/28/2016'
)
SELECT
Agent_name, Training_date,
ROUND(AVG(CASE WHEN date <= Training_date THEN Score END)) AS Avg_pre_training,
ROUND(AVG(CASE WHEN date > Training_date THEN Score END)) AS Avg_post_training
FROM (
SELECT
Agent_name, Score,
PARSE_DATE('%m/%d/%Y', date) AS date,
PARSE_DATE('%m/%d/%Y', Training_date) AS Training_date
FROM training JOIN agents
ON Name = Agent_name
)
GROUP BY Agent_name, Training_date
-- ORDER BY Agent_name, Training_date
注意此查詢玩:我加了幾行,使例子更通用來解決同一用戶的多種培訓案例
如果他們有多個分數會怎麼樣?你只是想包括第一個和最後一個?或者之前和之後立即? –
他們在訓練之前都會有多個分數和多個分數。我希望平均所有之前和平均所有訓練後。 – Boberton