对于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
我有一个特殊的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) 好的,我很困惑为什么会出现以下行为。
我有一个“交易标头”表和“交易明细”表。对于某些功能,详细信息表需要一些规范化才能提取“备注”数据。每个详细记录中最多可以包含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中的一个客户端可以有多个记录。
我已经尝试过正确和完全加入,但是一切都一样。 …
我很懒,有时候很懒,但是嘿(讽刺的是)这就是我们如何把事情做好的?
有一个简单的想法可能或不在那里.如果它是我想知道,如果不是,也许我会成功.
当我使用我的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 Server 2005中的SQL Server代理作业执行存储过程.
这项工作一直持续到昨天.从昨天起,这项工作耗时超过1小时而不是2分钟.
我在SSMS中执行了存储过程,执行时间不到1分钟.
我无法弄清楚为什么它作为SQL Server代理作业执行时需要超过1小时?
我有一个名为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时失败.
任何人都可以帮我解决这个问题吗?
我们目前有一个场景,其中一个表实际上有几个(10到15)布尔标志(不是可空bit字段).不幸的是,在逻辑层面上实际上不太可能简化这一点,因为布尔值的任何组合都是允许的.
有问题的表是一个事务表,最终可能有数千万行,插入和选择性能都非常关键.虽然我们目前还不太确定数据的分布,但是所有标志的组合应该提供相对良好的基数,即使其成为SQL Server使用的"有价值"索引.
典型的选择查询场景可能是仅基于3或4个标志来选择记录,例如WHERE FLAG3=1 AND FLAG7=0 AND FLAG9=1.为这些选择查询使用的所有标志组合创建单独的索引是不切实际的,因为它们中有很多.
鉴于这种情况,有效索引这些领域的建议方法是什么?该表是新的,因此现在还没有现有的数据需要担心,我们在表的实际实现中有相当大的灵活性.
目前我们正在考虑两个主要选项:
int总是使用的1或2个其他字段).我担心的是,鉴于仅包含一些字段的典型用法,此方法将跳过索引并采用表扫描.让我们称之为选项A(阅读了一些回复后,似乎这种方法效果不好,因为索引中字段的顺序会有所不同,因此无法在所有字段上有效地索引).目前,我们明显倾向于选择B.为了完整起见,这将在SQL Server 2008上运行.
任何建议将不胜感激.
编辑:拼写,清晰度,查询示例,选项B的其他信息.
我正在尝试通过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) 我们可以从SQL Server中选择Top 10或Select Top 'N'排序.
但有没有办法从顶部的结果中跳过第一行?
我的意思是我得到了结果select top 5,然后我跳过第一行并且只得到接下来的4行?
有没有办法知道任何视图是否正在引用某个特定的表.我使用下面的代码,它只给出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 ×10
sql ×6
t-sql ×2
indexing ×1
join ×1
performance ×1
php ×1
sql-agent ×1
union ×1