åãªãã®SQLã¹ã¿ã€ã«ã¬ã€ããå®çŸ©ããŠã¿ã
ãªãå®çŸ©ããã
- ã³ãŒãã¯æžãæéããèªãæéã®æ¹ãé·ããSQLãäŸå€ã§ã¯ãªããšæã£ãŠããŸããèªã¿ããã(çè§£ãããã)ããããã«ã¹ã¿ã€ã«ã¬ã€ãã䜿ããããšæã£ãŠããŸã
- ã©ãããã¯ãšãªããèªã¿ãããããã¯äººã«ãã£ãŠå·®ç°ããããšæããŸããããããã®ãèªã¿ãããããããŒã å ã§ããåãããããã«ã¹ã¿ã€ã«ã¬ã€ãã䜿ããããšæã£ãŠããŸã
- ã¹ã¿ã€ã«ã¬ã€ãã§ããããŸã§ã¯æããããå®çŸ©ãããšããããããã¯å人ã®èªç±ã§ããšããéšåãæç¢ºã«ã§ããŸããããã¯äœèšãªã¬ãã¥ãŒã³ã¹ããäžããã®ã«åœ¹ç«ã€ã¯ãã ãšæã£ãŠããŸã
- ã¹ã¿ã€ã«ã¬ã€ããå®çŸ©ã§ããã°linterã«ææããŠããããŸãã人éã«ææãããããæ©æ¢°ã«ææãããæ¹ãå¿ççå®å
šæ§ãé«ããšæã£ãŠããŸã
- ææããæ¹ãã¹ãã¬ã¹ãªããã§
- ããžãã¯ã«é¢ãããªãéšåã§äœèšãªè°è«ãçãããã人éã¯ããžãã¯ãè°è«ããæ¹ãçç£æ§ãé«ãã¯ã
- ã¹ã¿ã€ã«ã¬ã€ããå®çŸ©ã§ããã°linterã«ææããŠããããŸãã人éã«ææãããããæ©æ¢°ã«ææãããæ¹ãå¿ççå®å
šæ§ãé«ããšæã£ãŠããŸã
åã¯ãããã®æ©æµãåŸããããšæã£ãŠããŸã
åºæ¬æ¹é
dbt-labsãå®ããŠããã¹ã¿ã€ã«ã¬ã€ãã«åŸã
- DWHãäœã£ãŠããäžã§dbtãã¡ã€ã³ã«ãªã£ãŠããæ°ãããŠããŸãããªã®ã§dbtãæ²ããŠããã¹ã¿ã€ã«ã¬ã€ãã«ä¹ã£ããã®ã¯å人çã«ããæ¹åæ§ãªã®ã§ã¯ãšæããŠããŸãã䞻芳ã§ã
- 察æéЬãšããŠGit Labã®ã¹ã¿ã€ã«ã¬ã€ãããããŸãããèªèº«ã®çµç¹ã«å¿ããŠã©ã£ã¡ã«ä¹ã£ããã®ã決ããŠããããšæããŸã
- åŒç€Ÿã§ã¯TTPSãšããèšèããããŸãã培åºçã«ãã¯ã£ãŠé²åããããšããæå³ã§ããåºæ¬ã¯dbtã®SQLã¹ã¿ã€ã«ã¬ã€ãã«ä¹ã£ãã£ãäžã§èªåéã®è²ãå ããã®ãè¯ããšæã£ãŠããŸã
- å°ã£ãæã«æéããããšå§å©ã«ãªããªããŠãããšæã£ãŠãŸã
dbt-labsã®SQLã¹ã¿ã€ã«ã¬ã€ã
- ã«ã³ãã¯æ«å°Ÿã«ã€ããŸããã
- ã€ã³ãã³ãã¯ã¹ããŒã¹4ã€ã«ããŸããã
- 1è¡ã¯80æå以äžã«ããŸããã
- ãã£ãŒã«ãåã颿°åã¯å šãŠå°æåã«ããŸããã
-
asã¯ãã£ãŒã«ããããŒãã«ã«å¥åãã€ãããšãã¯ã€ããããã«ããŸããã - éèšã¯ä»ã®ããŒãã«ãšçµåããåã«ã§ããã ãæ©ãå®è¡ããŸããã
-
order byãgroup byããããšãã¯ååãåæãããããçªå·ã§äžŠã¹ãŸããã- ããããã€ãã®ã«ã©ã ã§
group byãããå¿ èŠããããšãã¯ã¢ãã«èšèšãèŠçŽã䟡å€ããããããããŸãã
- ããããã€ãã®ã«ã©ã ã§
-
unionããunion allã®æ¹ã奜ãŸãã - joinããéã«
cãªã©ã®é æåã§ãšã€ãªã¢ã¹ããã®ã¯ãããŸããã - 2ã€ä»¥äžã®ããŒãã«ãjoinããå Žåã¯ãã«ã©ã åã®åã«ããŒãã«ã®ãšã€ãªã¢ã¹ãã€ããŸãããã1ã€ã®ããŒãã«ããéžæããã ããªãäžèŠã§ã
- joinã¯æç€ºçã«æžããŸããã(
joinã§ã¯ãªãinner joinã®ããã«)ããŸããleft joinãåºæ¬ãšããŠãright joinãããšãã¯fromã§åç §ããããŒãã«ãšjoinã§åç §ããããŒãã«ãå ¥ãæ¿ããŸããã - è¡æ°ãçãããããšã«æé©åããã®ã¯ãããŸããããæ¹è¡ã¯å®ãã(è¡æ°ãçãããããšã«ãã£ãŠçããèªã¿ã«ãããæ¶è²»ãã)è³ã®ãªãœãŒã¹ã¯é«ãïŒ
äžèšãããšã«ããSQL(dbt)ã®ãµã³ãã«(åŒçšå )
with
my_data as (
select * from {{ ref('my_data') }}
),
some_cte as (
select * from {{ ref('some_cte') }}
),
some_cte_agg as (
select
id,
sum(field_4) as total_field_4,
max(field_5) as max_field_5
from some_cte
group by 1
),
final as (
select [distinct]
my_data.field_1,
my_data.field_2,
my_data.field_3,
-- use line breaks to visually separate calculations into blocks
case
when my_data.cancellation_date is null
and my_data.expiration_date is not null
then expiration_date
when my_data.cancellation_date is null
then my_data.start_date + 7
else my_data.cancellation_date
end as cancellation_date,
some_cte_agg.total_field_4,
some_cte_agg.max_field_5
from my_data
left join some_cte_agg
on my_data.id = some_cte_agg.id
where my_data.field_1 = 'abc'
and (
my_data.field_2 = 'def' or
my_data.field_2 = 'ghi'
)
having count(*) > 1
)
select * from final
èªåã®è²ãå ãã
åºæ¬çã«dbtã®ã¹ã¿ã€ã«ã¬ã€ãã«ä¹ã£ãããŸãããããã¯optionalã§ãããªã£ãŠãã®ã¯å€ãããããŸã
åæã«åã®è§£éã远å ããŸã(é ããªãã«dbtãç¥ã ãã£ãŠæžããšåãä»åšããäœå°ããªãã®ã§)
- ã«ã³ãã¯æ«å°Ÿã«ã€ããŸããã
- ã«ã³ããé ã«ã€ããæ¹ããããšæããŸã
- ã«ã³ããé ã«ãã£ãæ¹ãããã£ãŒã«ããäœåãããæ°ãããããšããæèŠã«çŽåŸããããšããããŸã
- ããããããŸããã£ãŒã«ãã®åæ°ãæ°ããããšããªãã®ãšãå€ãã®ãã£ãŒã«ãã䞊ã¹ãŠãããšãã¯ã¢ãã«ã®äœãæ¹ãèŠçŽããæ¹ããããããšæãå§ããŸãã
- ã«ã³ããé ã«ãããšãdiffãå°ãªããŠæžããšããæèŠãååããããããŸãããããã¯ãªãã»ã©ãªãšæããŸããããã£ãŒã«ãã®è¿œå ãå€ãçºçããå Žåã¯ã«ã³ãã¯é ã«ã€ããã®ããããããšæããŸãã
- åã®å Žåã¯ããã®ãããªããšã¯ããã»ã©å€ãçºçããªãã®ã§ãã«ã³ããåŸãã®æ¹ãèªã¿ãããæããããåŸãã«ããããã«ããŸãã
- ã€ã³ãã³ãã¯ã¹ããŒã¹4ã€ã«ããŸããã
- ããã¯çµæ§æ±ºãã§4ã«ããŠããŸã
- BQã¯2ã§ãããGoogleã¯2ã«ããããåŸåããããšæã£ãŠããŸã
- 匷ããŠèšããªããããŸããã¹ããããããšèªã¿ã¥ããã®ã§ã4ãšããæ¯èŒçå³ããæ¡ä»¶ãã€ããŠããŸããã¹ãããããªãããã«æèããã®ã¯ãããªãšæã£ãŠããŸã
- ããã¯çµæ§æ±ºãã§4ã«ããŠããŸã
- 1è¡ã¯100æå以äžã«ããŸããã
- 80ãã100ã«ããŸãã
- 80ã¯çµæ§å°ãªãã§ã
- äžã®ãã£ã¹ãã¬ã€ã®è§£å床é«ããªã£ãŠããã100ãããã§ãè¯ããšæã£ãŠããŸã
- ãã£ãŒã«ãåã颿°åã¯å
šãŠå°æåã«ããŸããã
- ãããçµæ§ç«çš®ã«ãªãããšå€ããšæããŸã
- åã¯å°æåããããšæã£ãŠããŸã
- 倧æåããããšããæèŠã«ã¯ãäºçŽèªãšãã£ãŒã«ããèŠåããããã«äºçŽèªã¯å€§æåãè¯ããšèããŸãããä»ã®èšèªã§äºçŽèªããããã倧æåã«ããããšã£ãŠããŸããªããšæããŠããŸã
- ãªãå°æåã®æ¹ãèªã¿ããããªãïŒãšæãå°æåã®æ¹ããããªãšæã£ãŠããŸã
-
asã¯ãã£ãŒã«ããããŒãã«ã«å¥åãã€ãããšãã¯ã€ããããã«ããŸããã- ããã
asã£ãŠçç¥ã§ãããã ãã£ãŠèšãããŠãã€é¡ããããšãããåã§ãããæç€ºã§ãããã®ã¯æç€ºããæ¹ããããšæããŸããã³ãŒãã¯èªãæéã®æ¹ãé·ãã®ã§
- ããã
- éèšã¯ä»ã®ããŒãã«ãšçµåããåã«ã§ããã ãæ©ãå®è¡ããŸããã
- å ã«èšç®åŠçãããŠã屿§æ å ±ã¯åŸã§joinããŸããããšããæå³ã ãšæã£ãŠããŸã
- ãã®ã»ããã¯ãšãªå šäœãã¹ãããªããããããã¯å¿ãããæ¹ãè¯ããšæã£ãŠããŸã
-
unionããunion allã®æ¹ã奜ãŸãã- BigQueryã«unionããªãã®ã§èæãæ¹§ããŠããªãã®ã§ãããæå³ããã¬ã³ãŒããèœã¡ãå¯èœæ§ã®ããå±éºæ§ã¯åé¿ããã»ããå®å šã ãšæããŸã
- joinããéã«
cãªã©ã®é æåã§ãšã€ãªã¢ã¹ããã®ã¯ãããŸããã- ä»ã®èšèªæžããšãã«äžæåã®å€æ°ãªããŠæ» å€ã«ã€ããªãããã«ãã¯ãšãªã§ãããã¯ãããŸããã
-
Tã®åŸã«T1ãT2ã£ãŠç¶ããŠããã®ãèªãã®ãèŸããªã£ãŠããŸãã®ã§æå³ãæã£ããšã€ãªã¢ã¹ãã€ããŠãããŸããã
- 2ã€ä»¥äžã®ããŒãã«ãjoinããå Žåã¯ãã«ã©ã åã®åã«ããŒãã«ã®ãšã€ãªã¢ã¹ãã€ããŸãããã1ã€ã®ããŒãã«ããéžæããã ããªãäžèŠã§ã
- æç€ºã§ãããã®ã¯æç€ºããæ¹ããããšæããŸããã³ãŒãã¯èªãæéã®æ¹ãé·ãã®ã§
- joinã¯æç€ºçã«æžããŸããã(
joinã§ã¯ãªãinner joinã®ããã«)ããŸããleft joinãåºæ¬ãšããŠãright joinãããšãã¯fromã§åç §ããããŒãã«ãšjoinã§åç §ããããŒãã«ãå ¥ãæ¿ããŸããã- æç€ºã§ãããã®ã¯æç€ºããæ¹ããããšæããŸããã³ãŒãã¯èªãæéã®æ¹(ry
- è¡æ°ãçãããããšã«æé©åããã®ã¯ãããŸããããæ¹è¡ã¯å®ãã(è¡æ°ãçãããããšã«ãã£ãŠçããèªã¿ã«ãããæ¶è²»ãã)è³ã®ãªãœãŒã¹ã¯é«ãïŒ
- ãã£ãŒã«ãã¯æ¹è¡ããŠäžŠã¹ãã®ãããã ããCTEã®éã«æ¹è¡ãå ¥ããããšãªã©ãããã«ã€ãªãããšæã£ãŠããŸã
optionalã«ãããã®
order byãgroup byããããšãã¯ååãåæãããããçªå·ã§äžŠã¹ãŸããã
ããã¯optionalã«ããŸãã
åã¯ãã®èšäºã«ãšãŠãè³æããŠããã®ã§ã©ã¡ãããšãããšçªå·ã§äžŠã¹ãŠããã®ãæšããŠããŸã
çªå·ã§äžŠã¹ãŠãçè§£ãããããããã®group byã«ããã®ãèšèšçã«é©ããŠãããšæããŠãããšããéšåã«ãè³æããŠããŸã
ãã ãååããšã«èšç®ãããã£ãŠæžãæ¹ãèªã¿ããããšã¯æããŸã
ããã¯æã£ãŠããªããŠãlinterã§æ³šæãããããšããªãã®ã§ãã£ã¡ãæããªããŠãããã®ã§ã¯ãšããã®ãåã®èãã§ã
远å ããããã®
- äºçŽèªã¯äœ¿ããªãããã«ããŸããã
-
timestampãšã䜿ã£ãŠããŸããã¡ã§ããã¿ã€ã ã¹ã¿ã³ãåã¯hogehoge_atã®ããã«_atãšããsuffixã§çµ±äžãããªã©ãããšããã§ã(åè) - é çªã衚ãæå³ã§
orderãšã䜿ãããŠããšããŸãããããªãšããã§ãšã©ãŒãåºãŠããªããŠãšçºçãããã«ãªããŸã
-
倧ããæ¹é(ç«çš®ã«ãªããããªãšãã)ã§æããŠããããã®ã¯ä»¥äžã«ãªããŸã
现ãããšããã¯SQLã®linterã§ããSQLfluffã䜿ã£ãŠä¿®æ£ããŠããŸãã®ããããšæããŸã
ãããã®ãã®ãèžãŸãã.sqlfluff
[sqlfluff:rules]
tab_space_size = 4
max_line_length = 100
indent_unit = space
comma_style = trailing
[sqlfluff:rules:L010]
capitalisation_policy = lower
[sqlfluff:rules:L011]
# Aliasing preference for tables
aliasing = explicit
[sqlfluff:rules:L012]
# Aliasing preference for columns
aliasing = explicit
[sqlfluff:rules:L014]
capitalisation_policy = lower
unquoted_identifiers_policy = aliases
[sqlfluff:rules:L016]
ignore_comment_lines = True
[sqlfluff:rules:L057]
additional_allowed_characters = "-"
[sqlfluff:templater:dbt]
project_dir = .
profiles_dir = .
profile = hogehoge
target = dev
æåŸã«
ç¹°ãè¿ãã«ãªããŸãããé ããªãã«åã®ã¹ã¿ã€ã«ãé©çšããã£ãŠããã€ããã¯æ¯é ãããŸãã
ãèªèº«ã®ç°å¢ãçµç¹ãããŒã ã®æåã«åãããŠã¹ã¿ã€ã«ã¯æ±ºããŠãã£ãŠãã ãã
åã®ã¹ã¿ã³ã¹ãšããŠã¯
- ç«çš®ã«ãªããããªã¹ã¿ã€ã«ã¯é¢ä¿è ãšåæããŠãããšã¯linterã«ä»»ãã
- ã§ããã ãdbtãæå±ããŠããææ³ã«ä¹ã£ãã
ã§ã
ãã®èšäºããç«çš®ã«ãªãããããããã«ãªãããšãé¡ã£ãŠããŸã
åèã«ãããŠããã ãããã®
Discussion