Sql 带数组的列到列(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和dataframes,我想在下表中做一些事情:

如您所见,我有一个itemid数组,每个人的value列上都有它对应的值,它们的长度显然是相同的。我要做的是为每个itemid创建一列,然后为特定的人在该列上设置值。例如,将有名为51493、51516等的列,对于第一个人,列51943上的值将为2,依此类推,对于其他没有51943值的人,则为null

我假设在for循环中使用for进行解析是非常低效的,因为我是数据帧新手,所以我希望能得到一些帮助来有效地进行解析。 谢谢

对于请求,这是提供以下数据的bigquery查询:

%%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表达式。