2015-08-21 57 views
0

我必须创建SQL查询来选择个人数据。每个人都有几个等级,我必须首先按时选择每个人。我不知道这是怎么做的,因为每个人的条件都不一样。下面是我目前的代码,这是行不通的。SQL选择所有条件不相同的行

SELECT s.sol_last_name, 
    g.grade_name, 
    MIN(sg.sol_grade_date_from) 
FROM [dbo].[dim_s####] AS s 
    LEFT JOIN [dbo].[fact_s####_grade] AS sg ON s.sol_key = sg.sol_grade_sollers_key 
    LEFT JOIN [dbo].[dim_grade] AS g ON g.grade_key = sg.sol_grade_grade_key 
GROUP BY s.sol_last_name, 
     g.grade_name 
HAVING MIN(sg.sol_grade_date_from) = sg.sol_grade_date_from 
+0

你介意在表格中添加一些数据到问题和预期结果吗?你能否在你的问题中解释什么是不同的条件? –

回答

0

你可以把最早日期在子查询,然后内连接有:

SELECT s.sol_last_name, 
    g.grade_name, 
    sg.sol_grade_date_from 
FROM [dbo].[dim_s####] AS s 

    INNER JOIN ( 
      select sol_grade_grade_key 
      ,min(sol_grade_date_from) as sol_grade_date_ 
      from from [dbo].[dim_grade] 
      GROUP BY sol_grade_grade_key) AS g 
    ON g.grade_key = sg.sol_grade_grade_key 

    LEFT JOIN [dbo].[fact_s####_grade] AS sg 
    ON s.sol_key = sg.sol_grade_sollers_key 
0

使用Common Table Expression(CTE),以节省一些打字。然后,只有在相同的sol_last_name没有较高等级的情况下,才能返回一行NOT EXISTS

WITH CTE (sol_last_name, grade_name, grade_date_from) AS 
(
SELECT s.sol_last_name, 
    g.grade_name, 
    sg.sol_grade_date_from 
FROM [dbo].[dim_s####] AS s 
    LEFT JOIN [dbo].[fact_s####_grade] AS sg ON s.sol_key = sg.sol_grade_sollers_key 
    LEFT JOIN [dbo].[dim_grade] AS g ON g.grade_key = sg.sol_grade_grade_key 
) 
select sol_last_name, grade_name, grade_date_from 
from cte as t1 
where not exists (select 1 from cte t2 
        where t2.sol_last_name = t1.sol_last_name 
        and t2.grade_date_from < t2.grade_date_from)