How to build “Star Rating” report in BigQuery (or sparklines, or color gradients)

后端 未结 5 1165
忘了有多久
忘了有多久 2021-02-03 14:44

Suppose I have the followng sample input:

WITH Ratings AS (
    (SELECT \'A\' name, 2 score) UNION ALL
    (SELECT \'B\' name, 0 score) UNION ALL
    (SELECT \'C         


        
5条回答
  •  栀梦
    栀梦 (楼主)
    2021-02-03 15:26

    Adding more-less generic option for producing time-series/sparklines type of report

    #standardSQL
    CREATE TEMP FUNCTION sparklines(arr ARRAY) AS ((
      SELECT STRING_AGG(CODE_POINTS_TO_STRING([code]), '') 
      FROM UNNEST(arr) el, 
      UNNEST([(SELECT MAX(el) FROM UNNEST(arr) el)]) mx, 
      UNNEST([(SELECT MIN(el) FROM UNNEST(arr) el)]) mn
      JOIN UNNEST([9602, 9603, 9605, 9606, 9607]) code WITH OFFSET pos
      ON pos = CAST(IF(mx = mn, 1, (el - mn) / (mx - mn)) * 4 AS INT64) 
    )); 
    WITH series AS (
      SELECT 1 id, [3453564, 5343333, 2876345, 3465234] arr UNION ALL
      SELECT 2, [5743231, 3276438, 1645738, 2453657] UNION ALL
      SELECT 3, [1,2,3,4,5,6,7,8,9,0] UNION ALL
      SELECT 4, [3245876, 2342879, 5876324, 7342564]  
    )  
    SELECT 
      id, TO_JSON_STRING(arr) arr, sparklines(arr) sparklines 
    FROM series 
    

    with result as below

    Row id  arr                                 sparklines   
    1   1   [3453564,5343333,2876345,3465234]   ▃▇▂▃     
    2   2   [5743231,3276438,1645738,2453657]   ▇▅▂▃     
    3   3   [1,2,3,4,5,6,7,8,9,0]               ▂▃▃▅▅▆▆▇▇▂   
    4   4   [3245876,2342879,5876324,7342564]   ▃▂▆▇       
    

    Adding Mosha's version (taken from his comments below)

    #standardSQL
    CREATE TEMP FUNCTION barchart(v ARRAY, MIN FLOAT64, MAX FLOAT64) AS ( 
      IF(
        MIN = MAX, 
        REPEAT(CODE_POINTS_TO_STRING([9603]), ARRAY_LENGTH(v)), 
        (
        SELECT STRING_AGG(CODE_POINTS_TO_STRING([9601 + CAST(ROUND(y) AS INT64)]), '') 
        FROM ( 
          SELECT SAFE_DIVIDE(e-min, MAX - MIN) * 7 y 
          FROM UNNEST(v) e)
        )
      )
    ); 
    CREATE TEMP FUNCTION vbar(v ARRAY) AS ( 
      barchart(v, (SELECT MIN(a) FROM UNNEST(v) a), (SELECT MAX(a) FROM UNNEST(v) a)) 
    );
    WITH numbers AS (
      SELECT 1 id, [3453564., 5343333., 2876345., 3465234.] arr UNION ALL
      SELECT 2, [5743231., 3276438., 1645738., 2453657.] UNION ALL
      SELECT 3, [1.,2,3,4,5,6,7,8,9,0] UNION ALL
      SELECT 4, [3245876., 2342879, 5876324, 7342564]  
    )  
    SELECT 
      id, TO_JSON_STRING(arr) arr, vbar(arr) sparklines 
    FROM numbers  
    

    if applied to same dummy data as above versions - produces below

    Row id  arr                                 sparklines   
    1   1   [3453564,5343333,2876345,3465234]   ▃█▁▃     
    2   2   [5743231,3276438,1645738,2453657]   █▄▁▂     
    3   3   [1,2,3,4,5,6,7,8,9,0]               ▂▃▃▄▅▆▆▇█▁   
    4   4   [3245876,2342879,5876324,7342564]   ▂▁▆█      
    

提交回复
热议问题