2015-08-21 56 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)