Mysql
使用維度表使用 CASE 表達式還是 JOIN 更好?
我有一個帶有時間戳的事實表,我想表達一周中的哪一天。我可以做這樣的事情:
SELECT CASE WHEN date_part(timestamp,'week') = 0 then 'Monday' WHEN date_part(timestamp,'week') = 1 then 'Tuestday'... FROM fact_table
或者我可以創建一個如下所示的維度表:
day_number day_name 0 Monday 1 Tuesday
然後與事實表進行 JOIN:
SELECT day_name FROM fact_table LEFT JOIN dm_days on day_number = date_part(timestamp, 'week')
哪一個更好?
如果某個不需要獲取任何功能(如 date_part)的指標(例如流量來自:時事通訊、搜尋引擎優化、附屬機構…)而不是日期,該怎麼辦?例如,這會更好嗎:
SELECT CASE id_channel WHEN 0 then 'SEO' WHEN 1 then 'Newsletter'... FROM fact_table
比這個?SELECT channel_name FROM fact_table LEFT JOIN dm_channels on channel_id = id_channel
對於這個問題,我會使用日期格式化函式(設置
lc_time
為適當的語言環境後)SELECT to_char(timestamp, 'Day') FROM fact_table
一般來說,表格形式對我來說更乾淨(當沒有合適的功能時)
如果有充分的理由沒有永久表,也許可以使用內聯表。
SELECT day_name FROM fact_table LEFT JOIN (VALUES (1,'Monday'),(2,'Tuesday'),(3,'Wednesday')) AS days(day_number ,day_name ) on day_number = date_part('dow',timestamp)::int
兩者都不是,對於 MySQL:
SELECT ts, DATE_FORMAT(ts, '%W') AS W, DATE_FORMAT(ts, '%a') AS a FROM ... +---------------------+--------+------+ | ts | W | a | +---------------------+--------+------+ | 2020-01-26 10:53:05 | Sunday | Sun | +---------------------+--------+------+
也就是說,只需使用表達式。