0

我正在将一些 IIS 日志导入 Power Pivot 以使用以下方法进行一些分析:

LogParser.exe "
SELECT 
EXTRACT_TOKEN(LogFileName, 5, '\\') As LogFile,
LogRow,
to_localtime(to_timestamp(date,time)) as LOG_DTTM,
cs-UserName as ClientUserName,
cs-Method,cs-Uri-Stem as UriStem,
cs-Uri-Query as UriQuery,
sc-Status as Status,
sc-SubStatus as SubStatus,
time-Taken as ElapsedTimeMS,
c-Ip As ClientIP,
s-ComputerName as ComputerName,
s-Ip as ServerIP,
s-Port as Port,
sc-Win32-Status as Win32Status,
cs(User-Agent) as UserAgent 
    INTO IIS_LOG_PROD_STAGING 
FROM somefile.log" -o:SQL -oConnString:"Driver=SQL Server;Server=MY_SERVER_NAME; Database=MY_DATABASE_NAME;Trusted_Connection=yes" -createTable:ON -e:10 -transactionRowCount:-1

...我的问题是: 我应该将 DateTime 列的离散部分拆分为数据库存储级别的单独列,还是应该留给 PowerPivot 模型中的计算列?

Marco Russo 似乎建议至少将 DATE 分成一个单独的列:
http ://sqlblog.com/blogs/marco_russo/archive/2011/09/01/separate-date-and-time-in-powerpivot-and- bis-tabular.aspx

PowerPivot 仍将该列读取为 DateTime,但小时/分钟/秒消失了,并且唯一值的数量减少到数据中不同的天数。当然,更容易加入日历表!

这似乎是有道理的。但是,如果我知道我想要在 HourOfDay、DayOfWeek、DayOfMonth 等级别进行分析,我是否也应该将它们拆分为单独的数据库列?

4

1 回答 1

3

我强烈建议创建一个日期表和一个时间表来进行这种类型的分析。日期将有助于计算星期几、月份日期等。它允许您通过简单的连接轻松地进行日期计算和分类。时间维度将按小时分组。我倾向于在我的数据库中创建这些表,并将它们从 SQL Server 拉到我的 Power Pivot 模型中。我的一般想法是在较低级别(SQL 数据库)中比在 Power Pivot 模型中更有效地完成行级计算。它们可以在两者中完成,因此位置取决于您以及服务器和运行 Power Pivot 模型的计算机上可用的内存和 CPU 量。由于 Power Pivot 是在单个笔记本电脑上打开的,我无法控制它们,因此我喜欢在 SQL Server 中进行大量计算。我看到你标记了 Power Query。有可用于在 Power Query 中创建日期维度的脚本不需要 SQL Server 中的表。我还没有在 Power Query 中构建时间维度,但是这里有一个很好的 SQL Server 脚本。日期表处于日期级别。时间表下降到秒,并允许您轻松地按分钟、小时等滚动时间。

这是链接中的日期表:

CREATE TABLE [dbo].[DimDate] (
    [DateKey] [int] NOT NULL
    ,[Date] [datetime] NOT NULL
    ,[Day] [char](10) NULL
    ,[DayOfWeek] [smallint] NULL
    ,[DayOfMonth] [smallint] NULL
    ,[DayOfYear] [smallint] NULL
    ,[PreviousDay] [datetime] NULL
    ,[NextDay] [datetime] NULL
    ,[WeekOfYear] [smallint] NULL
    ,[Month] [char](10) NULL
    ,[MonthOfYear] [smallint] NULL
    ,[QuarterOfYear] [smallint] NULL
    ,[Year] [int] NULL
    );

这是时间表:

create table time_of_day 
( 
     time_of_day_key smallint primary key, 
     hour_of_day_24 tinyint,                --0-23, military/European time 
     hour_of_day_12 tinyint,                --1-12, repeating for AM/PM, for us American types 
     am_pm char(2),                         --AM/PM 
     minute_of_hour tinyint,                --the minute of the hour, reset at the top of each hour. 0-59 
     half_hour tinyint,                     --1 or 2, if it is the first or second half of the hour 
     half_hour_of_day tinyint,              --1-24, incremented at the top of each half hour for the entire day 
     quarter_hour tinyint,                  --1-4, for each quarter hour 
     quarter_hour_of_day tinyint,           --1-48, incremented at the tope of each half hour for the entire day 
     string_representation_24 char(5),      --military/European textual representation 
     string_representation_12 char(5)       --12 hour clock representation sans AM/PM 
) 

即使您没有真正创建维度模型,拥有这些表也会很有帮助。

于 2015-07-28T19:39:13.897 回答