Create a table with Record type column

后端 未结 1 1538
攒了一身酷
攒了一身酷 2020-12-07 05:52

I want to create a new table with both record type columns and non record type column. The table will be populated by a query.

this is the query:

se         


        
相关标签:
1条回答
  • 2020-12-07 06:10

    Below should work

    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}); 
      }"
    ) 
    

    I think output is as expected:

    [
      {
        "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"
          }
        ]
      }
    ]
    
    0 讨论(0)
提交回复
热议问题