From a952c32600903ac1203ac6fb401ea786674979af Mon Sep 17 00:00:00 2001 From: Jack Forgash <58153492+forgxyz@users.noreply.github.com> Date: Wed, 6 Jul 2022 08:39:24 -0600 Subject: [PATCH] AN-1690/topshot_metadata (#36) * topshot metadata * adjust stats column names * bronze view and inserted_timestamp --- models/bronze/bronze__topshot_metadata.sql | 15 +++++ .../silver/silver__nft_topshot_metadata.sql | 60 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 models/bronze/bronze__topshot_metadata.sql create mode 100644 models/silver/silver__nft_topshot_metadata.sql diff --git a/models/bronze/bronze__topshot_metadata.sql b/models/bronze/bronze__topshot_metadata.sql new file mode 100644 index 0000000..a6718d0 --- /dev/null +++ b/models/bronze/bronze__topshot_metadata.sql @@ -0,0 +1,15 @@ +{{ config ( + materialized = 'view' +) }} + +SELECT + id, + contract, + DATA, + VALUE, + TO_TIMESTAMP_NTZ(SUBSTR(SPLIT_PART(metadata$filename, '/', 4), 1, 10) :: NUMBER, 0) AS _inserted_timestamp +FROM + {{ source( + 'flow_external', + 'topshot_moments_minted_metadata_api' + ) }} diff --git a/models/silver/silver__nft_topshot_metadata.sql b/models/silver/silver__nft_topshot_metadata.sql new file mode 100644 index 0000000..73cdd37 --- /dev/null +++ b/models/silver/silver__nft_topshot_metadata.sql @@ -0,0 +1,60 @@ +{{ config( + materialized = 'incremental', + incremental_strategy = 'delete+insert', + cluster_by = ['_inserted_timestamp::DATE'], + unique_key = 'nft_id' +) }} + +WITH metadata AS ( + + SELECT + * + FROM + {{ ref('bronze__topshot_metadata') }} + +{% if is_incremental() %} +WHERE + _inserted_timestamp >= ( + SELECT + MAX(_inserted_timestamp) + FROM + {{ this }} + ) +{% endif %} + +qualify ROW_NUMBER() over ( + PARTITION BY id + ORDER BY + DATA :getMintedMoment :data :acquiredAt :: TIMESTAMP +) = 1 +), +FINAL AS ( + SELECT + id AS nft_id, + contract AS nft_collection, + DATA :getMintedMoment :data :id :: STRING AS nbatopshot_id, + DATA :getMintedMoment :data :flowSerialNumber :: NUMBER AS serial_number, + DATA :getMintedMoment :data :setPlay :circulationCount :: NUMBER AS total_circulation, + DATA :getMintedMoment :data :play :description :: VARCHAR AS moment_description, + DATA :getMintedMoment :data :play :stats :playerName :: STRING AS player, + DATA :getMintedMoment :data :play :stats :teamAtMoment :: STRING AS team, + DATA :getMintedMoment :data :play :stats :nbaSeason :: STRING AS season, + DATA :getMintedMoment :data :play :stats :playCategory :: STRING AS play_category, + DATA :getMintedMoment :data :play :stats :playType :: STRING AS play_type, + DATA :getMintedMoment :data :play :stats :dateOfMoment :: TIMESTAMP AS moment_date, + DATA :getMintedMoment :data :set :flowName :: STRING AS set_name, + DATA :getMintedMoment :data :set :flowSeriesNumber :: NUMBER AS set_series_number, + DATA :getMintedMoment :data :play :assets :videos :: ARRAY AS video_urls, + DATA :getMintedMoment :data :play :stats :: OBJECT AS moment_stats_full, + DATA :getMintedMoment :data :play :statsPlayerGameScores :: OBJECT AS player_stats_game, + DATA :getMintedMoment :data :play :statsPlayerSeasonAverageScores :: OBJECT AS player_stats_season_to_date, + _inserted_timestamp + FROM + metadata + WHERE + DATA :getMintedMoment :: STRING IS NOT NULL +) +SELECT + * +FROM + FINAL