我有以下表结构:
id int -- more like a group id, not unique in the table
AddedOn datetime -- when the record was added
Run Code Online (Sandbox Code Playgroud)
具体而言id
,每天最多只有一条记录.我必须编写一个查询,返回每个的连续(在日级别)日期间隔id
.预期的结果结构是:
id int
StartDate datetime
EndDate datetime
Run Code Online (Sandbox Code Playgroud)
请注意,时间部分AddedOn
可用,但在此处并不重要.
为了更清楚,这里有一些输入数据:
with data as
(
select * from
(
values
(0, getdate()), --dummy record used to infer column types
(1, '20150101'),
(1, '20150102'),
(1, '20150104'),
(1, '20150105'),
(1, '20150106'),
(2, '20150101'),
(2, '20150102'),
(2, '20150103'),
(2, '20150104'),
(2, '20150106'),
(2, '20150107'),
(3, …
Run Code Online (Sandbox Code Playgroud) 我写了一个创建两列的查询:the_day
,和amount_raised
那天。这是我所拥有的:
我想添加一个运行总和为amount_raised
:
最终,我希望该sum
列在达到 100 万后重置。
递归方法高于我的工资等级,所以如果有人知道一种无需创建全新表即可重置总和的方法,请发表评论(也许带有 RESET 功能?)。谢谢
我有表1:
Id Program Price Age
12345 ABC 10 1
12345 CDE 23 3
12345 FGH 43 2
12346 ABC 5 4
12346 CDE 2 5
12367 CDE 10 6
Run Code Online (Sandbox Code Playgroud)
和一个Table2:
ID Program BestBefore
12345 ABC 2
12345 FGH 3
12346 ABC 1
Run Code Online (Sandbox Code Playgroud)
我想得到下表
Id Program Price Age
12345 CDE 10 1
12346 CDE 2 5
12367 CDE 10 6
Run Code Online (Sandbox Code Playgroud)
即从第一张表中获取ID + Program不在第二张表中的行。我正在使用MS SQL Server Express 2012,并且不想将任何列添加到原始数据库。是否可以不创建临时变量而做?
有一个WinAPI函数GetProcessIoCounters
,它提供给定进程的所有I/O操作的详细信息:读取/写入操作的数量以及自进程启动以来读取/写入的字节数.最有可能的任务管理器使用此函数来显示这些数字:
是否有一种相对简单的方法来获得相同或相似的统计数据,但是对于整个系统,它开始了吗?
请注意,它与枚举所有当前进程并总结结果不同GetProcessIoCounters
,因为有进程启动,运行一段时间并完成.当我调用GetProcessIoCounters
这样的进程时不再存在,但我想知道系统的整体I/O.
我打算每小时收集一次这些统计数据并将其记录到数据库中以供将来分析并帮助调试.
我正在寻找一种适用于没有WMI的Windows XP的方法(我们使用明显缩减的Windows XP Embedded),但如果这种方法仅适用于更高版本的Windows,请分享.最终它会很有用.
更新
我尝试了Jerry CoffinDeviceIoControl(IOCTL_DISK_PERFORMANCE)
建议的方法.
我不得不跑去diskperf.exe -Y
让它发挥作用.我甚至没有重新启动,但没有它DeviceIoControl
失败GetLastError=31
(连接到系统的设备无法运行.)DeviceIoControl
重启后继续工作而无需diskperf.exe -Y
再次运行,但第一次调用DeviceIoControl
后重新启动后返回零字段(BytesRead,BytesWritten,ReadCount,WriteCount).进一步的调用返回非零统计数据.显然,系统启动时会有一些实质性的磁盘活动,但它没有被计算在内.因此,看起来DeviceIoControl
重启后的第一次调用确实启用/启动计数器.
如果我运行diskperf.exe -N
,则DeviceIoControl
立即停止工作而无需重新启动.当我跑diskperf.exe -Y
,然后DeviceIoControl
再次正常工作.
现在的问题是:diskperf.exe -Y
我的程序中有什么以及如何做同样的事情?
更新2
我之后diskperf.exe -Y
和之后导出了整个注册表,diskperf.exe -N
并寻找差异.我能找到的唯一区别是一键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PartMgr
"EnableCounterForIoctl"=dword:00000001
Run Code Online (Sandbox Code Playgroud)
diskperf.exe -Y
添加此密钥,diskperf.exe -N
将其删除.
我试图将此密钥直接添加/删除到注册表中.
如果密钥不存在且DeviceIoControl
不起作用(在我运行之后diskperf.exe -N
)并且我添加了这样的密钥:
reg add "HKLM\SYSTEM\CurrentControlSet\Services\PartMgr" …
Run Code Online (Sandbox Code Playgroud) 在提示这是重复的问题之前,请注意问题标题中的“无联合”。
出于演示目的:
我有一个很大的SQL,它根据几个条件对结果进行分组。用户类型,用户来源,登录尝试
例如
SELECT
...
GROUP BY
UserType, UserOrigin, LoginAttempts
Run Code Online (Sandbox Code Playgroud)
我已经能够按UserType
和将结果分组UserOrigin
。
所以我的结果看起来像这样。
User: Admin Origin: US
User: Admin Origin: CND
User: Editor Origin: US
User: Editor Origin: UK
User: Editor Origin: MX
etc...
Run Code Online (Sandbox Code Playgroud)
我还尝试按登录尝试次数将结果分组,但仅基于该值是否为null进行分组。
我真的不需要多少时间的信息,但是否尝试失败了。
换句话说,我仅根据LoginAttempts列是否为分组结果。
这是SQL的理想结果。
User: Admin Origin: US Login Attempts: null
User: Admin Origin: US Login Attempts: (not null)
User: Admin Origin: CND Login Attempts: null
User: Admin Origin: CND Login Attempts: (not null)
User: Editor Origin: US Login …
Run Code Online (Sandbox Code Playgroud) 我tbBroker
在本地数据库上有一个表,Agency
在链接服务器对象“DIS”上有一个表。
我正在尝试将数据从本地迁移tbBroker
到 DISAgency
表
还要注意的是
tbBroker's Columns = Agency's Columns
BrokerCode = AgencyNumber
BusinesssName = AgencyName
City = City
tbSystemUser.EmailAddress = EmailAddress
Run Code Online (Sandbox Code Playgroud)
此外,tbBroker
还有两个额外的列DISImportFlag bit
和DISCreatTS datetime
. 这两个字段应该被更新为1
与GETDATE()
每当数据从迁移(在插入过程中)tbBroker
到Agency
表,以确定哪些行已被迁移。
我写了以下查询
USE [DISTemp];
MERGE INTO
[dbo].[Agency] AS [TARGET]
USING
[aginbr].[dbo].[tbBroker] AS [SOURCE]
ON
[TARGET].[AgencyNumber] COLLATE Latin1_General_CI_AI = [SOURCE].[BrokerCode]
WHEN NOT MATCHED BY TARGET THEN
INSERT (
[AgencyName]
, [Address1]
, [Address2]
, [PostalCode] …
Run Code Online (Sandbox Code Playgroud) 我的要求是将 emailIds 列表存储在单个列中,这样做的最佳数据类型是什么?我的列就像 EmailTo 、 EmailCC 、 EmailBCC ,我需要在其中存储 Id 列表。另外,请帮助我了解数据类型的大小。我正在使用 SQL 服务器。
我有一个SQL查询,第一列是日期,第二列和第三列是其他信息.我们可以假设每天只有一条记录,我们可以假设日期是有序的.
除了第一列,其它的包含不同的数据类型的数据long
,int
,nchar
,varchar
,等.
我的目标是确定在比较第T-1天时是否有任何剩余列在第T天发生了变化(如果是这样的话)(比如列N被更改,N可以是任何剩余列,并且可能有多列被更改在同一天)我想将日期(第一列)与第N天的Col N记录和第T-1天的Col N(可能是该列的标题)一起返回,所以我的输出将是是:
Date T|Header of Col Modified|Value of Col @ T-1|Value of Col @ T
Run Code Online (Sandbox Code Playgroud)
如果有多个更改,我们将为每个更改添加一行.
显然,"慢"方式是首先将所有数据放在某处,然后逐个比较结果数据集.但是我只是想知道是否有任何快速方法在T-SQL中执行它以便我可以直接获得结果(或接近结果的东西,以便查询输出需要很少的数据操作,因为它会SQL Server能够更快地完成繁重的工作,只返回我需要的数据而不是整个表.
我正在使用SQL Server,因此需要一个T-SQL解决方案.
运行SQL Server 2014
.如何从表中插入多行并将插入的数据与新ID组合?
让我们看一个精简的例子吧!
DECLARE @Old TABLE
(
[ID] [int] PRIMARY KEY,
[Data] [int] NOT NULL
)
DECLARE @New TABLE
(
[ID] [int] PRIMARY KEY,
[OtherID] [int] NULL
)
INSERT INTO [dbo].[Test] ([Data])
OUTPUT inserted.[ID], [@Old].[ID] /* <--- not supported :( */ INTO @New
SELECT [Data]
FROM @Old
Run Code Online (Sandbox Code Playgroud)
我需要将插入的ID与正在插入的数据相结合.我可以假设插入的行与所选行的顺序相同吗?([Data]
插入操作后我将无法加入.)
以下似乎是一个可能的解决方案,但我找不到它的工作原理.它保证有效吗?
DECLARE @Old TABLE
(
[RowID] [int] PRIMARY KEY IDENTITY, -- Guaranteed insert order?
[ID] [int] NOT NULL,
[Data] [int] NOT NULL
)
DECLARE @New TABLE …
Run Code Online (Sandbox Code Playgroud) 我在SQL Server上有以下查询,其中一些值存储在先前计算的变量中:
SET @Command = N'INSERT INTO Products (Id
,Region
,Name
,Category
,CreatedBy
,CreatedOn
,) SELECT ' + @Id + ',
Region,
''' + @ProductName + ''',
Category,
CreatedBy,
CreatedOn FROM ' + @ProductTable + '
WITH (NOLOCK) WHERE Id IS NOT NULL';
EXEC(@Command)
Run Code Online (Sandbox Code Playgroud)
它运行正常,除非@ProductName的值包含引号(例如Jim的Product),在这种情况下,我将收到以下错误:字符串后的引号未封闭
有没有办法在这样的动态查询中处理变量中的单引号,其中插入的所选值之一(在这种情况下为@ProductName)直接是要插入的值,而不是源表上的实际列名需要检索其值以进行插入?
sql ×9
sql-server ×8
t-sql ×4
c++ ×1
dynamicquery ×1
email ×1
performance ×1
postgresql ×1
sqldatatypes ×1
winapi ×1
windows ×1