Mysql

使用維度表使用 CASE 表達式還是 JOIN 更好?

  • January 24, 2020

我有一個帶有時間戳的事實表,我想表達一周中的哪一天。我可以做這樣的事情:

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  |
+---------------------+--------+------+

也就是說,只需使用表達式。

引用自:https://dba.stackexchange.com/questions/257656