Sql server 不循环的每组行的随机x计数

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

我正在寻找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_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。无需进一步测试。