创建具有记录类型列的表

Posted

技术标签:

【中文标题】创建具有记录类型列的表【英文标题】:Create a table with Record type column 【发布时间】:2016-01-27 14:28:51 【问题描述】:

我想创建一个包含记录类型列和非记录类型列的新表。 该表将由查询填充。

这是查询:

select country, Count(*) CNT_Events,item,currency,sum(amount) as SUM_amount, count(transactionID) as CNT_transactionID
from
(select "US" country, "USD" currency, "book" item, 20 amount, 1 transactionID),
(select "Spain" Country,"EUR" currency, "book" item, 10 amount, 2 transactionID),
(select "US" Country,"USD" currency, "cup" item, 5 amount, 3 transactionID),
(select "Spain" Country,"EUR" currency, "notebook" item, 15 amount, 4 transactionID),
(select "Spain" Country,"EUR" currency, "notebook" item, 13 amount, 5 transactionID),
(select "US" Country, "null" currency, "null" item, null amount, null transactionID)
GROUP BY country, item, currency

架构:

[  
  'name': 'country', 'type': 'STRING',
  'name': 'CNT_Events', 'type': 'INTEGER',
    'name': 'Purchases', 'type': 'RECORD',
     'mode': 'REPEATED',
     'fields': [
       'name': 'item', 'type': 'STRING',
       'name': 'currency', 'type': 'STRING',
       'name': 'SUM_amount', 'type': 'integer',
       'name': 'CNT_transactionID', 'type': 'integer' 
       ]    
        ,

  ]

结果:

Country CNT_Events  Purchases.item  Purchases.currency  Purchases.SUM_amount Purchases.CNT_transactionID 
US  3   cup USD 5   1       book    USD 20  1 
Spain   3   book    EUR 10  1       notebook    EUR 28  2

我该怎么做? 谢谢!

【问题讨论】:

【参考方案1】:

下面应该可以工作

SELECT country, CNT_Events, Purchases.item, Purchases.currency, Purchases.SUM_amount, Purchases.CNT_transactionID 
FROM JS( 
  ( // input table 
    SELECT country, SUM(CNT_Events) AS CNT_Events, NEST(CONCAT(item, ',', currency, ',', STRING(SUM_amount) , ',', STRING(CNT_transactionID))) AS Purchases 
    FROM ( 
      SELECT country, COUNT(1) CNT_Events, item, currency, SUM(amount) AS SUM_amount, COUNT(transactionID) AS CNT_transactionID
      FROM
      (SELECT "US" country, "USD" currency, "book" item, 20 amount, 1 transactionID),
      (SELECT "Spain" Country,"EUR" currency, "book" item, 10 amount, 2 transactionID),
      (SELECT "US" Country,"USD" currency, "cup" item, 5 amount, 3 transactionID),
      (SELECT "Spain" Country,"EUR" currency, "notebook" item, 15 amount, 4 transactionID),
      (SELECT "Spain" Country,"EUR" currency, "notebook" item, 13 amount, 5 transactionID),
      (SELECT "US" Country, "null" currency, "null" item, NULL amount, NULL transactionID)
      GROUP BY country, item, currency
    ) GROUP BY country
  ), 
  country, CNT_Events, Purchases, // input columns 
  "[ // output schema 
    'name': 'country', 'type': 'STRING',
    'name': 'CNT_Events', 'type': 'INTEGER',
    'name': 'Purchases', 'type': 'RECORD',
     'mode': 'REPEATED',
     'fields': [
       'name': 'item', 'type': 'STRING',
       'name': 'currency', 'type': 'STRING',
       'name': 'SUM_amount', 'type': 'integer',
       'name': 'CNT_transactionID', 'type': 'integer' 
       ]    
     
  ]", 
  "function(row, emit)  // function 
    var c = []; 
    for (var i = 0; i < row.Purchases.length; i++)  
      x = row.Purchases[i].split(','); 
      t = item:x[0], 
            currency:x[1], 
            SUM_amount:parseInt(x[2]), 
            CNT_transactionID:parseInt(x[3]) ;
      c.push(t); 
    ; 
    emit(country: row.country, CNT_Events: row.CNT_Events, Purchases: c); 
  "
) 

我认为输出符合预期:

[
  
    "country": "US",
    "CNT_Events": "3",
    "Purchases": [
      
        "item": "book",
        "currency": "USD",
        "SUM_amount": "20",
        "CNT_transactionID": "1"
      ,
      
        "item": "cup",
        "currency": "USD",
        "SUM_amount": "5",
        "CNT_transactionID": "1"
      
    ]
  ,
  
    "country": "Spain",
    "CNT_Events": "3",
    "Purchases": [
      
        "item": "notebook",
        "currency": "EUR",
        "SUM_amount": "28",
        "CNT_transactionID": "2"
      ,
      
        "item": "book",
        "currency": "EUR",
        "SUM_amount": "10",
        "CNT_transactionID": "1"
      
    ]
  
]

【讨论】:

以上是关于创建具有记录类型列的表的主要内容,如果未能解决你的问题,请参考以下文章

Toad 问题:Oracle 类型作为显示所有记录的表中列的数据类型

多个表与一个具有更多列的表

创建列类型为 RECORD 的表

在 R 中使用 SQLsave 创建的表的列的数据类型是啥

使用 django html 模板创建具有动态行和列的表

更改 BigQuery 中记录列的类型