Sql server 我们将对这些数据进行大量的报告。大多数数据库都能很好地处理空值,并且有一个定义良好的数据模型将使报表比试图根据EAV模型生成报表容易得多。@N West。在这种特殊情况下,实体属性值模型似乎是合适的,因为度量是时间的函数,而不是彼此的函数。因此,报告很可能
Sql server 我们将对这些数据进行大量的报告。大多数数据库都能很好地处理空值,并且有一个定义良好的数据模型将使报表比试图根据EAV模型生成报表容易得多。@N West。在这种特殊情况下,实体属性值模型似乎是合适的,因为度量是时间的函数,而不是彼此的函数。因此,报告很可能,sql-server,views,data-warehouse,database-performance,sparse-columns,Sql Server,Views,Data Warehouse,Database Performance,Sparse Columns,我们将对这些数据进行大量的报告。大多数数据库都能很好地处理空值,并且有一个定义良好的数据模型将使报表比试图根据EAV模型生成报表容易得多。@N West。在这种特殊情况下,实体属性值模型似乎是合适的,因为度量是时间的函数,而不是彼此的函数。因此,报告很可能是针对每个记录中存在的属性进行的。但是这个模型不是通用的,我同意你的观点。我在考虑这个。这种权衡可能是值得的。问题是如何最好地一次将多行插入值表?当然,可能有25列会在每一帧中进行更改,因此单独完成每一列的工作不应该让服务器感到不知所措。想法?
我们将对这些数据进行大量的报告。大多数数据库都能很好地处理空值,并且有一个定义良好的数据模型将使报表比试图根据EAV模型生成报表容易得多。@N West。在这种特殊情况下,实体属性值模型似乎是合适的,因为度量是时间的函数,而不是彼此的函数。因此,报告很可能是针对每个记录中存在的属性进行的。但是这个模型不是通用的,我同意你的观点。我在考虑这个。这种权衡可能是值得的。问题是如何最好地一次将多行插入值表?当然,可能有25列会在每一帧中进行更改,因此单独完成每一列的工作不应该让服务器感到不知所措。想法?我还发现以下是一次完成多个插入的推荐和有用的方法<代码>在表(FirstCol,SecondCol)中插入值('First',1),('Second',2),('Third','3',('Fourth','4')('etch')今天我想起了几件事。1.分析函数,如Lag或First_值(但我不知道如何用null进行分区)。2.只需使用一个变量:
选择@val2=ISNULL(v.val2,@val2),@val2作为val2_列
——但这不起作用,因为不允许在数据检索的同时进行数据赋值。Express?数据仓库?对不起,“10g数据库”太多了,它不是数据仓库。也许是一个数据集市。这很小-您没有机会将包含真实数据的任何内容作为express的目标。太小,太有限(ram,cpu)。今天我想到了几件事。1.分析函数,如Lag或First_值(但我不知道如何用null进行分区)。2.只需使用一个变量:选择@val2=ISNULL(v.val2,@val2),@val2作为val2_列
——但这不起作用,因为不允许在数据检索的同时进行数据赋值。Express?数据仓库?对不起,“10g数据库”太多了,它不是数据仓库。也许是一个数据集市。这很小-您没有机会将包含真实数据的任何内容作为express的目标。太小,太有限(ram,cpu)。
SELECT ISNULL(
val1,
(
SELECT TOP 1 val1
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val1 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val1,
ISNULL(
val2,
(
SELECT TOP 1 val2
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val2 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val2,
ISNULL(
val3,
(
SELECT TOP 1 val3
FROM [values] subv
WHERE subv.id <= v.id
AND subv.val3 IS NOT NULL
ORDER BY
subv.id DESC
)
) AS val3
FROM [values] v
sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
USE Test
ALTER DATABASE Test SET TRUSTWORTHY ON
GO
IF OBJECT_ID ('cached_value') is not null
BEGIN
DROP FUNCTION cached_value
END
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE name = 'SqlClr')
BEGIN
DROP ASSEMBLY SqlClr
END
GO
CREATE ASSEMBLY SqlClr
FROM 'C:\SqlClr\bin\Debug\SqlClr.dll'
WITH PERMISSION_SET = UNSAFE
GO
CREATE FUNCTION cached_value(@rowid bigint, @col int, @current_value bigint)
RETURNS bigint
AS EXTERNAL NAME SqlClr.[SqlClr.StoredProcedures].[cached_value]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Diagnostics;
using System.Data.SqlClient;
namespace SqlClr
{
public class StoredProcedures
{
public static long last_rowid;
public static Dictionary<int, long> values = new Dictionary<int, long>();
[SqlFunction(DataAccess = DataAccessKind.Read, IsDeterministic = false)]
public static Nullable<long> cached_value(long rowid, int col, Nullable<long> current_value)
{
if (rowid < last_rowid)
{
values.Clear();
}
last_rowid = rowid;
if (current_value.HasValue)
{
values[col] = current_value.Value;
return current_value.Value;
}
if (values.ContainsKey(col))
return values[col];
else
return null;
}
}
}
SELECT
dbo.cached_value(id, 1, val1) AS val1,
dbo.cached_value(id, 2, val2) AS val2,
......
dbo.cached_value(id, 25, val25) AS val25
FROM LotsOfValues