Привет, у меня есть таблица: значения с ValueId, Timestamp, Value и BelongTo.Каждые 15 минут в эту таблицу вставляется новая строка с новым значением, текущей отметкой времени и конкретным полем BelongTo.И теперь я хочу найти пропуски, я имею в виду значения, в которых метки времени друг за другом превышают 15 минут.
Я пытался это сделать:
var gaps = from p1 in db.T_Values
join p2 in db.T_Values on p1.TimeStamp.AddMinutes(15) equals p2.TimeStamp
into grups where !grups.Any() select new {p1};
, и это работает, но я не знаюесли это optimall, что вы думаете?и я не знаю, как я могу добавить, где p1.BelongTo == 1. Потому что этот запрос ищет все данные.
Джон сказал
var gaps = from p1 in db.T_Values
where p1.BelongTo == 1
where !db.T_Values.Any(p2 => p1.TimeStamp.AddMinutes(15) == p2.Timestamp)
select p1;
Джон этот последний запрос переведен на:
exec sp_executesql N'SELECT [t0].[ValueID], [t0].[TimeStamp], [t0].[Value],
[t0].[BelongTo], [t0].[Type]
FROM [dbo].[T_Values] AS [t0]
WHERE (NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[T_Values] AS [t1]
WHERE DATEADD(ms, (CONVERT(BigInt,@p0 * 60000)) % 86400000,
DATEADD(day, (CONVERT(BigInt,@p0 * 60000)) / 86400000, [t0].[TimeStamp])) = [t1].[TimeStamp]
))) AND ([t0].[BelongTo] = @p1)',N'@p0 float,@p1 int',@p0=15,@p1=1
, и это работает, если все строки не имеют одинаковое принадлежность, когда есть строки с BelongTo со многими различными значениями, тогда я заметил, что мне нужно добавить в sql: и [t1] .BelongTo =1, который в конечном итоге должен выглядеть следующим образом:
N'SELECT [t0].[ValueID], [t0].[TimeStamp], [t0].[Value], [t0].[BelongTo], [t0].[Type]
FROM [dbo].[T_Values] AS [t0]
WHERE (NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[T_Values] AS [t1]
WHERE DATEADD(ms, (CONVERT(BigInt,@p0 * 60000)) % 86400000,
DATEADD(day, (CONVERT(BigInt,@p0 * 60000)) / 86400000, [t0].[TimeStamp])) = [t1].[TimeStamp]
and [t1].BelongTo = 1
))) AND ([t0].[BelongTo] = @p1)',N'@p0 float,@p1 int',@p0=15,@p1=1
другими словами:
SELECT TimeStamp
FROM [dbo].[T_Values] AS [t0]
WHERE NOT( (EXISTS (SELECT NULL AS [EMPTY]
FROM [dbo].[T_Values] AS [t1]
WHERE DATEADD(MINUTE, 15, [t0].[TimeStamp]) = [t1].[TimeStamp])))
AND ([t0].[BelongTo] = 1)
может измениться на
SELECT TimeStamp
FROM [dbo].[T_Values] AS [t0]
WHERE NOT( (EXISTS (SELECT NULL AS [EMPTY]
FROM [dbo].[T_Values] AS [t1]
WHERE DATEADD(MINUTE, 15, [t0].[TimeStamp]) = [t1].[TimeStamp] and [t1].BelongTo=1)))
AND ([t0].[BelongTo] = 1)
, но я все еще думаю, как я могу добавить эток ссылкеq