2014-11-21 51 views
0

我想过滤一个表,首先按日期范围,然后在该指定的时间段内选择最大值记录。下面的代码显示超出指定时间段的记录。在两个特定日期范围内过滤SQL表最大记录

所以在下面的例子中,我指定了1天,但它也显示2014-11-11的记录。

declare @BgnDate date = '2014-11-10' 
    declare @EndDate date ='2014-11-10' 

    SELECT EmployeeName, TargetTxDate, sum(ActualTarget) as Actual, sum(RequiredTarget) AS ReqTarget, sum(variance) AS Variance 
    FROM dbo.TargetsTx as TargetsTx 
    WHERE  (Variance IN 
    (SELECT MAX (Variance) AS Expr1 
    FROM   dbo.TargetsTx AS TargetsTx_1 
    WHERE  (@BgnDate IS NULL OR TargetsTx_1.TargetTxDate >= @BgnDate) AND 
(@EndDate IS NULL OR TargetsTx_1.TargetTxDate < DATEADD(d, 1, @EndDate)))) 

    group by EmployeeName,TargetTxDate 
+1

你正在研究哪个dbms? MySQL的? MSSQL?甲骨文? ..... – Fred 2014-11-21 11:14:30

回答

0

你是否在过度思考?为什么不是这样的:

SELECT EmployeeName, TargetTxDate, sum(ActualTarget) as Actual, sum(RequiredTarget) AS ReqTarget, sum(variance) AS Variance 
FROM dbo.TargetsTx as TargetsTx 
WHERE TargetTxDate >= @BgnDate 
AND TargetTxDate < @EndDate 
group by EmployeeName,TargetTxDate 
ORDER BY TargetTxDate DESC 
LIMIT 1 
+0

我想我已经过时了,感谢 – user3656185 2014-11-24 06:41:20

0

您的查询的问题是,您在内部查询中有where。您可以通过将其放入外部查询来修复它。不过,我会推荐使用窗口函数。

declare @BgnDate date = '2014-11-10' 
declare @EndDate date ='2014-11-10' 

SELECT e.* 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY EmployeeName ORDER BY Variance DESC) as seqnum 
     FROM dbo.TargetsTx t 
     WHERE (@BgnDate IS NULL OR TargetTxDate >= @BgnDate) AND 
      (@EndDate IS NULL OR TargetsTx_1.TargetTxDate < DATEADD(d, 1, @EndDate)) 
    ) e 
WHERE seqnum = 1; 

我有点不清楚为什么你一个使用group by或看重你想最大化(我猜variance),但这种技术可以在任何的变量。

+0

收到谢谢,这也很有效,谢谢你的劝告。 – user3656185 2014-11-24 06:42:15

相关问题