标签: sql-server

使用结果集系列中的最新非NULL值替换NULL值(SQL Server 2008 R2)

对于SQL Server 2008 R2

我有一个看起来像这样的结果集(注意[price]是数字,下面的NULL表示一个NULL值,结果集按product_id和timestamp排序)

product timestamp          price 
------- ----------------   -----
   5678 2008-01-01 12:00   12.34
   5678 2008-01-01 12:01    NULL
   5678 2008-01-01 12:02    NULL
   5678 2008-01-01 12:03   23.45
   5678 2008-01-01 12:04    NULL
Run Code Online (Sandbox Code Playgroud)

我想将其转换为(基本上)从最新的前一行复制非空值的结果集,以生成如下所示的结果集:

product timestamp          price  
------- ----------------   -----
   5678 2008-01-01 12:00   12.34
   5678 2008-01-01 12:01   12.34
   5678 2008-01-01 12:02   12.34
   5678 2008-01-01 12:03   23.45
   5678 2008-01-01 12:04   23.45
Run Code Online (Sandbox Code Playgroud)

我没有找到允许我这样做的聚合/窗口函数(再次这只是SQL Server 2008 R2所需要的.)

我希望找到一个分析聚合函数来为我做这个,比如......

LAST_VALUE(price) OVER (PARTITION BY product_id ORDER BY timestamp)
Run Code Online (Sandbox Code Playgroud)

但我似乎没有找到任何方法在窗口中执行"累积最新的非空值"(将窗口绑定到前面的行,而不是整个分区)

除了创建一个表值用户定义的函数之外,是否有任何内置函数可以实现此目的?


更新:

显然,此功能在"Denali"CTP中可用,但在SQL Server 2008 R2中不可用.

LAST_VALUE http://msdn.microsoft.com/en-us/library/hh231517%28v=SQL.110%29.aspx …

sql-server aggregate-functions analytic-functions sql-server-2008-r2

7
推荐指数
2
解决办法
1万
查看次数

需要使用聚合函数提高SQL查询的性能

我有一个特殊的SQL查询,似乎遇到了一个神秘的性能问题.这是查询:

SELECT COUNT(LengthOfTime) AS TotalTime, 
       SUM(LengthOfTime) AS TotalLength, 
       SUM(LengthOfTime) / COUNT(LengthOfTime) AS AverageTime, 
       SUM(Pops) / COUNT(LengthOfTime) AS AveragePop 
  FROM ((SELECT * 
           FROM (SELECT *, ID & YearRec AS ID2 
                   FROM MyFirstTable 
                 UNION ALL 
                 SELECT *, ID & YearRec AS ID2 
                   FROM Table2011) AS TEMP 
          WHERE STARTTIME >= '8/1/2011 00:00:00' 
            AND StartTime <= '8/5/2011 23:59:59' ) AS TEMP2 
  JOIN AppleTable ON TEMP2.Reason = AppleTable.Skills ) 
  JOIN PeopleTable ON TEMP2.Operator = PeopleTable.Operators 
 WHERE AppleTable.[ON] = 1 
   AND PeopleTable.[ON] = 1 
   AND Rec_Type …
Run Code Online (Sandbox Code Playgroud)

sql sql-server performance aggregate-functions

7
推荐指数
2
解决办法
3985
查看次数

一起使用SQL JOIN和UNION

好的,我很困惑为什么会出现以下行为。

我有一个“交易标头”表和“交易明细”表。对于某些功能,详细信息表需要一些规范化才能提取“备注”数据。每个详细记录中最多可以包含3个由TranRemark1,TranRemark2和TranRemark3列指定的注释。

我整理了以下查询,认为它可以工作,但返回的记录数不正确。

SELECT  
b.ClientName,
a.TranID,
a.TranRemark1,
a.TranDateOfService,
a.TranPayment   
FROM
(select TranRemark1, TranID from TranDetail
union all
select TranRemark2, TranID from TranDetail
union all
select TranRemark3, TranID from TranDetail) AS a
LEFT JOIN TranHeader AS b ON
b.TranID = a.TranID
WHERE a.TranRemark1 = @RemarkCode;
Run Code Online (Sandbox Code Playgroud)

我得到的结果集基于与ClientName匹配的TranHeader记录的数量,而不是与TranDetail中的where子句匹配的记录的数量。例如,如果客户“ Acme Inc.” 标头表中有3条记录,我使用上面的查询来查询注释代码“ 1234”(与TranDetail中只有1条记录匹配),结果集列出了正确的记录3次。

编辑 所以我希望从上面的例子中得到这样的结果集:

ClientName--TranID--TranRemark1--TranDateOfService--TranPayment
Acme Inc    ADC11   1234         8-16-2011          45.11    
Run Code Online (Sandbox Code Playgroud)

我得到的是:

ClientName--TranID--TranRemark1--TranDateOfService--TranPayment
Acme Inc    ADC11   1234         8-16-2011          45.11    
Acme Inc    ADC11   1234         8-16-2011          45.11  
Acme Inc    ADC11   1234         8-16-2011          45.11  
Run Code Online (Sandbox Code Playgroud)

请记住,TranHeader中的一个客户端可以有多个记录。

我已经尝试过正确和完全加入,但是一切都一样。 …

sql sql-server union join sql-server-2008

7
推荐指数
1
解决办法
5万
查看次数

用垃圾数据填充表格?

我很懒,有时候很懒,但是嘿(讽刺的是)这就是我们如何把事情做好的?

有一个简单的想法可能或不在那里.如果它是我想知道,如果不是,也许我会成功.

当我使用我的MSSQL数据库时,有时候我想测试各种事务在表,视图和程序等方面的性能......有没有人知道是否有办法用x一堆垃圾数据填充表格进行试验.

一个人可以很简单..

INSERT INTO `[TABLE]`
SELECT `COLUMNS` FROM [`SOURCE_TABLE`]
Run Code Online (Sandbox Code Playgroud)

或者做某种......

DECLARE count int 
SET count = 0

WHILE count <= `x`
BEGIN
INSERT INTO `[TABLE]`
(...column list...)
VALUES
(...VALUES (could include the count here as a primary key))

SET count = count + 1
END
Run Code Online (Sandbox Code Playgroud)

但似乎已经或应该已经存在某种东西了.有任何想法吗??

sql sql-server

7
推荐指数
1
解决办法
2230
查看次数

SQL Server代理作业运行缓慢

我正在使用SQL Server 2005中的SQL Server代理作业执行存储过程.

这项工作一直持续到昨天.从昨天起,这项工作耗时超过1小时而不是2分钟.

我在SSMS中执行了存储过程,执行时间不到1分钟.

我无法弄清楚为什么它作为SQL Server代理作业执行时需要超过1小时?

sql-server sql-server-2005 sql-agent sql-agent-job

7
推荐指数
1
解决办法
8500
查看次数

连接Int列

我有一个名为Field_Data的表,表中的数据如下所示:

Date                          Track_ID          Item#
2011-02-25 00:00:00.000       70212             1
2011-02-25 00:00:00.000       70212             2
2011-03-09 00:00:00.000       70852             1
2011-03-09 00:00:00.000       70852             3
Run Code Online (Sandbox Code Playgroud)

我想把输出作为:

Date                          Final_ID
2011-02-25 00:00:00.000       70212_1
2011-02-25 00:00:00.000       70212_2
2011-03-09 00:00:00.000       70852_1
2011-03-09 00:00:00.000       70852_3
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情:

Select Date,Track_ID + '_' + Item# AS Final_ID
From Field_Data
Run Code Online (Sandbox Code Playgroud)

但它给了我以下错误:

消息245,级别16,状态1,行1
转换将varchar值'_'转换为数据类型int时失败.

任何人都可以帮我解决这个问题吗?

sql t-sql sql-server sql-server-2005 sql-server-2008

7
推荐指数
2
解决办法
2万
查看次数

SQL Server中多个位字段的索引

我们目前有一个场景,其中一个表实际上有几个(10到15)布尔标志(不是可空bit字段).不幸的是,在逻辑层面上实际上不太可能简化这一点,因为布尔值的任何组合都是允许的.

有问题的表是一个事务表,最终可能有数千万行,插入和选择性能都非常关键.虽然我们目前还不太确定数据的分布,但是所有标志的组合应该提供相对良好的基数,即使其成为SQL Server使用的"有价值"索引.

典型的选择查询场景可能是仅基于3或4个标志来选择记录,例如WHERE FLAG3=1 AND FLAG7=0 AND FLAG9=1.为这些选择查询使用的所有标志组合创建单独的索引是不切实际的,因为它们中有很多.

鉴于这种情况,有效索引这些领域的建议方法是什么?该表是新的,因此现在还没有现有的数据需要担心,我们在表的实际实现中有相当大的灵活性.

目前我们正在考虑两个主要选项:

  • 创建一个包含所有位字段的索引(这可能包括int总是使用的1或2个其他字段).我担心的是,鉴于仅包含一些字段的典型用法,此方法将跳过索引并采用表扫描.让我们称之为选项A(阅读了一些回复后,似乎这种方法效果不好,因为索引中字段的顺序会有所不同,因此无法在所有字段上有效地索引).
  • 有效地执行我认为SQL Server在内部执行的操作,并使用二元运算符将位字段编码为单个int字段(AND-ing和OR-ing一起使用:1,2,4,8等).我在这里担心的是我们需要进行某种计算来查询这个编码字段,这会再次跳过索引.此解决方案的维护和复杂性也是一个问题.让我们把这个选项B. 附加信息:该参数用于这种方法,我们可以有一个相对简单和短期指标,其中包括从表和本场的一个或两个字段.其他字段将缩小需要评估的记录数量,并且由于编码字段将包含所有位字段,因此SQL Server将能够使用从索引中直接检索的数据执行计算(即索引扫描) )而不是表(即表扫描).

目前,我们明显倾向于选择B.为了完整起见,这将在SQL Server 2008上运行.

任何建议将不胜感激.

编辑:拼写,清晰度,查询示例,选项B的其他信息.

sql sql-server indexing sql-server-2008

7
推荐指数
2
解决办法
1793
查看次数

没有从sqlsrv_num_rows得到任何回报

我正在尝试通过php页面从MS SQL中回收数据.我有一个有效的连接,我正在尝试一个简单的SELECT*FROM MyTable,但无论我做什么,sqlsrv_num_rows都是空白的!

这是我的代码:

    function connect() {

    $serverName = DB_HOST; //serverName\instanceName
    $connectionInfo = array( "Database"=>DB_NAME, "UID"=>DB_USER, "PWD"=>DB_PASSWORD);
    $this->connection = sqlsrv_connect( $serverName, $connectionInfo);
    sqlsrv_connect( $serverName, $connectionInfo);


    if( $this->connection ) {
         echo "<br>Connection established.<br />";
    }else{
         echo "<br>Connection could not be established.<br />";
         die( print_r( sqlsrv_errors(), true));
    }       


}
Run Code Online (Sandbox Code Playgroud)

连接建立的回声是如此工作所有AOK那里!

现在当我做一个简单的查询时:

    function query($sql) {
    if ($this->debug) {
        echo $sql . "<br />";
    }       
    $this->sql = $sql;
    $this->recordset = sqlsrv_query($this->connection, $sql);

    if (!$this->recordset) {
        die('<br><br>Invalid query :<br><br><bold>' . $this->sql . '</bold><br><br>' . sqlsrv_errors()); …
Run Code Online (Sandbox Code Playgroud)

php sql-server

7
推荐指数
1
解决办法
1万
查看次数

跳过SQL Server 2005的第一行?

我们可以从SQL Server中选择Top 10Select Top 'N'排序.

但有没有办法从顶部的结果中跳过第一行?

我的意思是我得到了结果select top 5,然后我跳过第一行并且只得到接下来的4行?

sql t-sql sql-server sql-server-2005

7
推荐指数
2
解决办法
1万
查看次数

引用表的视图列表

有没有办法知道任何视图是否正在引用某个特定的表.我使用下面的代码,它只给出SP和函数名称:

select * from sys.objects p inner join sys.sql_modules m
on p.object_id = m.object_id 
where m.definition like '%abc%'
Run Code Online (Sandbox Code Playgroud)

请帮忙!!!

sql-server

7
推荐指数
2
解决办法
9890
查看次数