SQL为所有

时间:2015-08-21 13:58:37

标签: 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

2 个答案:

答案 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

答案 1 :(得分: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)