Sql 带数组的列到列(Bigquery)
我不熟悉bigquery和dataframes,我想在下表中做一些事情: 如您所见,我有一个itemid数组,每个人的value列上都有它对应的值,它们的长度显然是相同的。我要做的是为每个itemid创建一列,然后为特定的人在该列上设置值。例如,将有名为51493、51516等的列,对于第一个人,列51943上的值将为2,依此类推,对于其他没有51943值的人,则为null 我假设在for循环中使用for进行解析是非常低效的,因为我是数据帧新手,所以我希望能得到一些帮助来有效地进行解析。 谢谢 对于请求,这是提供以下数据的bigquery查询:Sql 带数组的列到列(Bigquery),sql,dataframe,google-bigquery,Sql,Dataframe,Google Bigquery,我不熟悉bigquery和dataframes,我想在下表中做一些事情: 如您所见,我有一个itemid数组,每个人的value列上都有它对应的值,它们的长度显然是相同的。我要做的是为每个itemid创建一列,然后为特定的人在该列上设置值。例如,将有名为51493、51516等的列,对于第一个人,列51943上的值将为2,依此类推,对于其他没有51943值的人,则为null 我假设在for循环中使用for进行解析是非常低效的,因为我是数据帧新手,所以我希望能得到一些帮助来有效地进行解析。 谢谢
%%bigquery lab_m_df
SELECT
# MIMIC3 sets all ages over 89 to 300 to avoid the possibility of
# identification.
IF(DATETIME_DIFF(ADMITTIME, DOB, DAY)/365.25 < 200,
DATETIME_DIFF(ADMITTIME, DOB, DAY)/365.25,
# The life expectancy of a 90 year old is approximately 5 years according
# to actuarial tables. So we'll use 95 as the mean age of 90+'s
95) AS age,
gender,
admission_type,
itemids,
value,
admission_location,
insurance,
marital_status,
ethnicity,
died
FROM
(SELECT
ARRAY_AGG(ITEMID) as itemids,
ARRAY_AGG(IFNULL(VALUE, 'null')) as value,
MAX(HOSPITAL_EXPIRE_FLAG) as died,
ANY_VALUE(ADMITTIME) as ADMITTIME,
ANY_VALUE(ADMISSION_TYPE) as admission_type,
ANY_VALUE(ADMISSION_LOCATION) as admission_location,
ANY_VALUE(INSURANCE) as insurance,
ANY_VALUE(MARITAL_STATUS) as marital_status,
ANY_VALUE(ETHNICITY) as ethnicity,
HADM_ID,
SUBJECT_ID
FROM
`{admissions_table}` AS adm
JOIN `{labevents_table}` AS diag
USING (HADM_ID, SUBJECT_ID)
WHERE DATETIME_DIFF(CHARTTIME, ADMITTIME, HOUR) <= 4
GROUP BY HADM_ID, SUBJECT_ID
)
JOIN `{patients_table}` AS patients
USING (SUBJECT_ID)
你想做的事情很棘手。更好的方法是为每一对单独设置一行:
select t.personid, itemid, val
from t cross join
unnest(itemids) itemid with offset ni join
unnest(value) val with offset nv
on ni = nv;
如果您知道您关心的项目,则生成列很简单:
select t.personid,
max(case when itemid = 1 then val end) as item1,
max(case when itemid = 2 then val end) as item2,
max(case when itemid = 3 then val end) as item3,
. . .
from t cross join
unnest(itemids) itemid with offset ni join
unnest(value) val with offset nv
on ni = nv
group by t.personid
请显示您开始使用的数据。@GordonLinoff您好,我上传了bigquery查询,它提供了这个表,因为数据很大。但是我假设这个查询足以理解我从中获取数据的表,它很有用吗?我确实知道我关心的项目。我特别关心40个项目ID。有没有一种方法可以以更美观的方式创建40列,而不是在itemid=1时执行40行maxcase,然后val结束为item1。我建议只使用max表达式。