2017-08-17 112 views
1

希望這個問題的答案很簡單(它似乎應該是,但我失去了一些東西)....我有一個簡單的查詢,從最小值一個表(通過子查詢),然後使用該最小值試圖得到一個簡單的months_between最終結果從子查詢使用min()結果返回多條記錄

我試圖儘可能簡單回答的問題是:什麼是最早的end_date和多遠從REPORT_DATE後面是這個END_DATE

這裏的查詢

select end_date term_date, months_between (cast (report_date as date), cast (end_date as date)) term_length 
from table1 
where end_date = 
    (select min (end_date) end_date 
    from table1 
    where rec_load_date = (select max (rec_load_date) from table1) 
     and active_rec = 'Y' and end_date <= report_date); 

我的問題是,雖然子查詢完美地工作,即我得到一個單一的min(end_date)值,在主查詢中使用它返回多個記錄。 (參見圖像)

當前結果: 1. term_date =分鐘(table1.end_date) 2. term_length = MONTHS_BETWEEN值進行比較table1.report_date和table1.end_date(即,用於在表1中記錄的實際END_DATE值)

當前結果(附加圖像):

記錄樣品返回(儘可能多的行,因爲有在表1適用END_DATE值)

樣本數據:

create table table1 (rec_load_date varchar(25), report_date as varchar (25), end_date as varchar (25)); 
insert into table1 (rec_load_date, report_date, end_date) values ('2017-08-10', '2017-07-31', '2017-02-28'); 
insert into table1 (rec_load_date, report_date, end_date) values ('2017-08-10', '2017-07-31', '2017-01-31'); 
insert into table1 (rec_load_date, report_date, end_date) values ('2017-08-10', '2017-07-31', '2017-04-30'); 
insert into table1 (rec_load_date, report_date, end_date) values ('2017-08-10', '2017-07-31', '2017-03-31'); 
insert into table1 (rec_load_date, report_date, end_date) values ('2017-08-10', '2017-07-31', '2017-01-31'); 
insert into table1 (rec_load_date, report_date, end_date) values ('2017-08-10', '2017-07-31', '2017-04-25'); 
insert into table1 (rec_load_date, report_date, end_date) values ('2017-08-10', '2017-07-31', '2017-01-31'); 

我如何可以從查詢得到以下結果的任何想法:「2017年1月31日」,6

Multiple recs returned

+0

好了,你有這裏面有一個20170131結束日期的記錄,因此被返回的行。這裏真正的目標是什麼?你想用這個查詢來回答什麼問題。 – scsimon

+1

您好scsimon,我試圖得到的具體答案是:什麼是最早的end_date,並且距離report_date有多遠這是end_date – Gar

回答

0

基於您的評論,您可以使用此:

select 
    report_date 
    ,datediff(day,report_date,min(end_date)) as DaysBack 
from 
    table1 
group by 
    report_date 

這仍然會給你的天回的每一行。如果你想爲最早,或最近report_date,那麼你可以通過添加訂單和TOP 1

select top 1 
    report_date 
    ,datediff(day,report_date,min(end_date)) as DaysBack 
from 
    table1 
group by 
    report_date 
order by 
    report_date asc --or desc 
+0

根據您的要求和您所描述的內容(通過report_date獲取答案),它可以正常工作,所以很多THNXS! 僅供參考......我正在尋找min(end_date),而不是結果中的report_date。但我認爲你已經足夠了解我需要做出的改變以獲得我想要的 p.s.您的解決方案/方法優雅而簡單,我傾向於使我的解決方案比他們需要的更復雜 – Gar

+0

沒有問題@gar和祝你好運! – scsimon

+1

嘿scsimon:我微調了你的查詢,得到了我需要的結果。再次,你的方法非常簡單和優雅,我需要開始這樣思考:)。 THNXS !!!!! – Gar

0

看起來像你的榜樣數據不完整,但我會忽略缺少rec_load_date現在,並假設你​​將正確返回一個值:2017-01-31

但再查詢外層的有效搜索select all rows from table1 where end_date = '2017-01-31',並有3行(在你的樣本數據,也許更多您的真實表)匹配這一點,標準..所以y你會得到多行!

如果你想得到一個單一的行,你將不得不把它釘在一個更專一。使用ROW_NUMBER() OVER(...ORDER BY x)對行進行編號,然後選擇rownumber爲1的行是單向的,即使有重複。儘管如此你沒有一個簡單的方法來保證WHICH行的編號爲1,如果你對end_date這樣的東西進行了天真的排序,那裏有多個相同的值。增加您訂購的列數或選擇不同的排序鍵。

+0

THNXS用於響應並提供一些見解。主要是我在「選擇table1中的所有行,其中end_date ='2017-01-31'」主要查詢將做什麼的性質上spazz'd。儘管如此,我仍然沒有真正的答案。也許我應該重新考慮整個方法......?我所問的問題是:什麼是最早的end_date,以及距離report_date離end_date多遠。注意:所有記錄值都具有相同的report_date'2017-07-31' – Gar