Sql server 不循环的每组行的随机x计数
我正在寻找25个随机线从每个机构在一个特定的时间框架。下面是我想出的一个脚本:Sql server 不循环的每组行的随机x计数,sql-server,Sql Server,我正在寻找25个随机线从每个机构在一个特定的时间框架。下面是我想出的一个脚本: DECLARE @dateStart DATE, @dateEnd DATE, @agency varchar(8) set @dateStart = '9/1/2016' set @dateEnd = '9/30/2016' IF OBJECT_ID('tempdb.dbo.#tmp_THISDATA', 'U') IS NOT NULL DROP TABLE #tmp_THI
DECLARE @dateStart DATE,
@dateEnd DATE,
@agency varchar(8)
set @dateStart = '9/1/2016'
set @dateEnd = '9/30/2016'
IF OBJECT_ID('tempdb.dbo.#tmp_THISDATA', 'U') IS NOT NULL
DROP TABLE #tmp_THISDATA
CREATE TABLE #tmp_THISDATA(
[ACCOUNT] [varchar](30) NOT NULL,
[AGENCY_CODE] [varchar](8) NOT NULL,
[THE_DATE] [DATETIME] NOT NULL)
DECLARE agencies CURSOR FOR
SELECT DISTINCT [AGENCY_CODE]
FROM [dbo].[CORE_DATA] dial
WHERE CAST([THE_DATE] AS DATE) BETWEEN @dateStart AND @dateEnd
OPEN agencies
FETCH NEXT FROM agencies
INTO @agency
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #tmp_THISDATA
SELECT TOP 25
[ACCOUNT]
,[AGENCY_CODE]
,[THE_DATE]
FROM [dbo].[CORE_DATA] dial
WHERE CAST([THE_DATE] AS DATE) BETWEEN @dateStart AND @dateEnd
AND AGENCY_CODE = @agency
ORDER BY NEWID()
END
SELECT *
FROM #tmp_THISDATA
这是可行的,但运行时间很长。这是一个丑陋的数据集,有一些努力来优化它,但我怀疑,如果这样做是可行的,消除循环也会加快它的速度
可以消除循环吗?您可以使用行数窗口功能
INSERT INTO #tmp_THISDATA
SELECT [ACCOUNT],
[AGENCY_CODE],
[THE_DATE]
FROM (SELECT Row_number()OVER(partition BY AGENCY_CODE ORDER BY Newid() ) AS rn,
[ACCOUNT],
[AGENCY_CODE],
[THE_DATE]
FROM [dbo].[CORE_DATA] dial
WHERE [THE_DATE] > dateadd(dd,-1,@dateStart) and [THE_DATE] <= @dateEnd) a
WHERE rn <= 25
您可以使用行数窗口功能
INSERT INTO #tmp_THISDATA
SELECT [ACCOUNT],
[AGENCY_CODE],
[THE_DATE]
FROM (SELECT Row_number()OVER(partition BY AGENCY_CODE ORDER BY Newid() ) AS rn,
[ACCOUNT],
[AGENCY_CODE],
[THE_DATE]
FROM [dbo].[CORE_DATA] dial
WHERE [THE_DATE] > dateadd(dd,-1,@dateStart) and [THE_DATE] <= @dateEnd) a
WHERE rn <= 25
您也可以使用交叉应用
Select Distinct A.Account
,B.Agency_Code
,B.The_Date
From [dbo].[CORE_DATA] A
Cross Apply (Select Top 25 Agency_Code,Agency_Code
From [dbo].[CORE_DATA]
Where Account=A.Account and The_Date between @dateStart AND @dateEnd
Order By NewID()
) B
您也可以使用交叉应用
Select Distinct A.Account
,B.Agency_Code
,B.The_Date
From [dbo].[CORE_DATA] A
Cross Apply (Select Top 25 Agency_Code,Agency_Code
From [dbo].[CORE_DATA]
Where Account=A.Account and The_Date between @dateStart AND @dateEnd
Order By NewID()
) B
我忘了这件事!现在运行这两个查询,我的脚本领先42分钟。。。我们来看看他们俩的情况。@n8。这将比当前的while loop approach快得多,我当然希望这是最快的case@n8. - 只是对Where子句做了一个小小的更改,以使用_DATE columnbetween上可用的任何索引。不使用索引吗?我已经忘记了这一点!现在运行这两个查询,我的脚本领先42分钟。。。我们来看看他们俩的情况。@n8。这将比当前的while loop approach快得多,我当然希望这是最快的case@n8. - 只是对Where子句做了一个小小的更改,以使用_DATE columnbetween上可用的任何索引。是否使用索引?@n8很难说Prdp是一个有价值的资源。就像治感冒的鸡汤。。。不能;我有一些其他的问题:我删减了很多列,以简化和同质化公共消费的查询。如果我有其他WHERE条件,似乎我需要在两个“SELECT”语句中都有这些条件,是吗?@n8。我看你选择了答案。我怀疑额外的where条件只需要在top select中,假定这将配对到适当的帐户。只是对表演很好奇。看起来你有一个大的表,PRDP的查询在一分钟内运行,我的查询在76分钟后仍在运行,你的查询是8分钟,我相信它最终会比我的解决方案更好,但我很清楚我的偏好。我正在查询的表是46gb,每天都在增长,并且已编制索引,但日期保存为varchars,因此我怀疑它没有得到优化。@n8 Kill mine。无需进一步测试。@n8很难说Prdp是一种有价值的资源。就像治感冒的鸡汤。。。不能;我有一些其他的问题:我删减了很多列,以简化和同质化公共消费的查询。如果我有其他WHERE条件,似乎我需要在两个“SELECT”语句中都有这些条件,是吗?@n8。我看你选择了答案。我怀疑额外的where条件只需要在top select中,假定这将配对到适当的帐户。只是对表演很好奇。看起来你有一个大的表,PRDP的查询在一分钟内运行,我的查询在76分钟后仍在运行,你的查询是8分钟,我相信它最终会比我的解决方案更好,但我很清楚我的偏好。我正在查询的表是46gb,每天都在增长,并且已编制索引,但日期保存为varchars,因此我怀疑它没有得到优化。@n8 Kill mine。无需进一步测试。