使用 DirectQuery 过滤重复出现的值 Power BI
Filtering reoccuring values Power BI using DirectQuery
我有一个 table 包含来自机器的时间戳和错误代码。
机器有时会连续多次重复相同的错误,但我只想将这些计为一个错误。因此,我正在寻找一种方法来计算这些错误是否再次发生,并使用某种过滤器过滤掉这些错误。
我正在使用 DirectQuery,因此使用 EARLIER() 获取最后一个错误似乎不起作用。
我应该如何过滤这些重复出现的错误?
如果您想在数据库中执行此操作,Azure SQL 数据库支持 LAG function,因此将数据加载到 Power BI 的查询可能如下所示:
declare @t table([Time] time, [Error] int)
insert into @t([Time], [Error]) values
('11:01', 0),
('12:12', 0),
('13:31', 4),
('14:50', 0),
('15:10', 4),
('15:20', 4),
('15:30', 4),
('15:40', 4),
('17:01', 1),
('18:09', 1),
('19:41', 0)
select
t.[Time]
, t.[Error]
, IIF(t.[Error] <> 0 and LAG(t.[Error], 1) OVER(ORDER BY t.[Time]) = t.[Error], 1, 0) as Reoccuring
from @t t
order by t.[Time]
请注意,该示例并未显示对数据进行分区,例如通过机器或其他东西,因为您的示例数据不包括它。如果需要做,必须在LAG函数中加上PARTITION BY clause。如果您使用确切的数据库架构更新您的问题,我也会更新我的答案。
正如 Andrey Nikolov 所假设的那样,我需要使用机器序列号来使用 PARTITION BY 子句。
SELECT TOP 100 PERCENT *,
(CASE WHEN error = 0 OR error = LAG(error, 1, 0) OVER (PARTITION BY serial_nr ORDER BY event_time DESC)
THEN 0
ELSE 1
END) AS error_is_new
FROM MyTable
我在 table 中添加了一个新列,其中包含是否有新错误。
我使用 error_is_new 只显示新的错误。
我有一个 table 包含来自机器的时间戳和错误代码。
机器有时会连续多次重复相同的错误,但我只想将这些计为一个错误。因此,我正在寻找一种方法来计算这些错误是否再次发生,并使用某种过滤器过滤掉这些错误。
我正在使用 DirectQuery,因此使用 EARLIER() 获取最后一个错误似乎不起作用。
我应该如何过滤这些重复出现的错误?
如果您想在数据库中执行此操作,Azure SQL 数据库支持 LAG function,因此将数据加载到 Power BI 的查询可能如下所示:
declare @t table([Time] time, [Error] int)
insert into @t([Time], [Error]) values
('11:01', 0),
('12:12', 0),
('13:31', 4),
('14:50', 0),
('15:10', 4),
('15:20', 4),
('15:30', 4),
('15:40', 4),
('17:01', 1),
('18:09', 1),
('19:41', 0)
select
t.[Time]
, t.[Error]
, IIF(t.[Error] <> 0 and LAG(t.[Error], 1) OVER(ORDER BY t.[Time]) = t.[Error], 1, 0) as Reoccuring
from @t t
order by t.[Time]
请注意,该示例并未显示对数据进行分区,例如通过机器或其他东西,因为您的示例数据不包括它。如果需要做,必须在LAG函数中加上PARTITION BY clause。如果您使用确切的数据库架构更新您的问题,我也会更新我的答案。
正如 Andrey Nikolov 所假设的那样,我需要使用机器序列号来使用 PARTITION BY 子句。
SELECT TOP 100 PERCENT *,
(CASE WHEN error = 0 OR error = LAG(error, 1, 0) OVER (PARTITION BY serial_nr ORDER BY event_time DESC)
THEN 0
ELSE 1
END) AS error_is_new
FROM MyTable
我在 table 中添加了一个新列,其中包含是否有新错误。
我使用 error_is_new 只显示新的错误。