如何将筛选器应用于SQL Server中返回的结果集

时间:2015-12-24 06:39:21

标签: sql sql-server sql-server-2008

我的SQL查询在此处返回此结果集:

Person_id   Product_id  Discount_id  Discount_Rule  Active_Thru
-------------------------------------------------------------------------
  1001        322         251         R1            '2016-12-23 21:36:38.890'
  1001        323         251         R1            '2017-01-23 21:36:38.890'
  1001        324         252         R2            '2016-12-23 21:50:30.933'

我需要通过在上面的结果集上应用过滤器来获得如下的结果集。这是为了从上述结果集中获取用于人的折扣ID。

Person_id   Discount_id  Discount_Rule    Active_Thru
------------------------------------------------------------------
1001         251           R1            '2016-12-23 21:50:30.933'
1001         252           R2            '2016-12-23 21:50:30.933'

示例SQLFiddle在这里http://sqlfiddle.com/#!3/97f20/1/0

2 个答案:

答案 0 :(得分:0)

您需要使用DISTINCT子句,如下所示:

SELECT DISTINCT
    Person_ID
    , Discount_ID
FROM Table

这是一个SQLFiddle,其中包含上述代码的工作原理。

另一种方法是使用GROUP BY,但在这种情况下它们都会评估相同的执行计划,因此请选择您喜欢的方式:

SELECT
    Person_ID
    , Discount_ID
FROM table
GROUP BY Person_ID
    , Discount_ID

这是一个SQLFiddle,其中包含上述代码的工作原理。

<强>更新

正如您在评论中提到的,您需要在此基础上构建并返回Person_ID,Discount_ID和Discount_Rule组合的最小active_thru日期。

为此你需要一个如下的查询:

SELECT
    Person_ID
    , Discount_ID
    , Discount_Rule
    , MIN(Active_thru) 'Min_Active_Thru'
FROM test
group by Person_id
  , Discount_Id
  , Discount_Rule

您还可以在此SQLFiddle中查看此查询的工作原理。

答案 1 :(得分:0)

尝试使用group by,如下所示:

SELECT person_id, discount_id
FROM table
GROUP BY person_id, discount_id