SQL查询从表中过滤,然后从过滤后的数据中选择不同的项

时间:2014-09-16 12:48:43

标签: sql sql-server tsql stored-procedures

我正在努力创建一个SQL查询,所以我希望有人能够帮助我。

这个想法是:我有一个名为[logs]的表。

我需要在此表上执行初始过滤器以缩小搜索范围。然后我们将其称为集合A.然后我需要计算子集A中的唯一条目。

所以我遇到的问题是如何选择select的结果。

我是否需要使用临时表或视图?

此查询将在1亿行上运行,因此,如果有更好的性能选项,请大声说出来。

到目前为止,这是我的尝试:

CREATE PROCEDURE CheckForActiveRadioCount
    @AccountCodeStart varchar(50),
    @AccountCodeEnd varchar(50),
    @RepeaterId varchar(50),
    @DateStart varchar(50),
    @DateEND varchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @_DateStart DATETIME2(2) = CAST(@DateStart as DATETIME2(2));
    DECLARE @_DateEnd DATETIME2(2) = CAST(@DateEnd as DATETIME2(2));

    DECLARE @_AcStart INT = CAST(@AccountCodeStart as INT); 
    DECLARE @_AcEnd INT = CAST(@AccountCodeEnd as INT);

    SELECT 
        messageId, time, direction, hasRouting, deviceType, unitId, accountCode, 
        clientId, data
    FROM 
        [LoggingServer].[dbo].[Logs] AS data WITH (INDEX = NCILogIdLogs) 
    WHERE
        ((deviceType = 1) OR (deviceType = 4))   
        AND (unitId LIKE @RepeaterId) 
        AND (direction = 0)
        AND (TRY_CONVERT(INT,[accountCode]) >= @_AcStart)  //ACCOUNT CODE CAN BE LETTERS, THESE SHOULD BE IGNORED
        AND (TRY_CONVERT(INT,[accountCode]) <= @_AcEnd)     //ACCOUNT CODE CAN BE LETTERS, THESE SHOULD BE IGNORED
        AND (time > @DateStart )
        AND (time < @DateEnd )  

    SELECT 
        COUNT(DISTINCT [AccoutCode]) 
    FROM 
        data AS NumberOfUniqueRadios

END    GO

的问题:

如果WHEREaccountCode可能是数字'ABC'(必须忽略)或'1234',我如何在[accountCode]上执行varchar必须包括在内吗?

我希望输出能够做两件事:

  1. 显示行数
    1. 显示唯一行的所有列(*)

1 个答案:

答案 0 :(得分:2)

评论太长了。

为什么要将参数作为字符串传递,然后将它们转换为适当的数据类型?存储过程应该采用正确的日期类型。

为什么要使用整数而不是字符串来比较帐户代码?

为什么要指定使用特定索引而不是让引擎选择最佳执行计划?

我认为你的代码应该更像这样:

CREATE PROCEDURE CheckForActiveRadioCount (
    @AccountCodeStart varchar(50),
    @AccountCodeEnd varchar(50),
    @RepeaterId varchar(50),
    @DateStart DATETIME2(2),
    @DateEND DATETIME2(2)
) AS
BEGIN
    SET NOCOUNT ON;

    SELECT COUNT(DISTINCTD accountCode) as NumberOfUniqueRadios
    FROM [FSK_LoggingServer].[dbo].[Logs] l
    WHERE (deviceType IN (1, 4) AND 
          unitId LIKE @RepeaterId AND
          direction = 0 AND 
          accountCode >= @_AcStart AND accountCode <= @_AcEnd AND
          try_convert(accountCode, int) is not null and
          time > @DateStart AND time < @DateEnd;
END;