2017-04-17 29 views
1

這裏連續數據集是我的表的例子:我需要返回重複值的最大數量的基礎上的日期

MID RecordDate Volume 
5555 4/1/2017 1 
5555 4/2/2017 2 
5555 4/3/2017 2 
5555 4/4/2017 2 
5555 4/5/2017 3 
5555 4/6/2017 3 
5555 4/7/2017 3 
5555 4/8/2017 3 
5555 4/9/2017 3 
5555 4/10/2017 3 
5555 4/11/2017 3 
5555 4/12/2017 3 
5555 4/13/2017 3 
5555 4/14/2017 3 
5555 4/15/2017 3 
5555 4/16/2017 3 
5555 4/17/2017 3 
5555 4/18/2017 3 
5555 4/19/2017 3 
5555 4/20/2017 3 
5555 4/21/2017 3 
5555 4/22/2017 3 
5555 4/23/2017 3 
5555 4/24/2017 3 
5555 4/25/2017 3 
5555 4/26/2017 2 
5555 4/27/2017 2 
5555 4/28/2017 2 
5555 4/29/2017 2 
5555 4/30/2017 2 

我試圖與同體積返回的連續天數在規定的時間段內。在我的例子中,數據是從2017年4月1日到2017年4月30日,但實際上希望將此調整爲30/40/60/90天的任何日期範圍..

我的預期結果是相似的對此:

+------+-------------+------------+---------+--------+ 
| MID | Start Date | End Date | Volume | Count | 
+------+-------------+------------+---------+--------+ 
| 5555 | 4/5/2017 | 4/25/2017 |  3 |  21 | 
+------+-------------+------------+---------+--------+ 

我爲我糟糕的格式化事先道歉。提前致謝!

所以在這裏是爲這個例子的解決方案代碼,可別人幫我做這個工作有一個以上的MID,在這裏我需要拉插每MID最大的伯爵表:

with cte as 
(
Select top 1 
    md1.merrickid 
    , StartDate = convert(char(10),min(md1.RecordDate),120) 
    , EndDate = convert(char(10),max(md1.RecordDate),120) 
    , md1.EstGasVolMCF 
    , cnt  = count(*) 
From (
    Select md.MerrickID 
    , md.RecordDate 
    , md.EstGasVolMCF 
    , grp = row_number() over (partition by md.merrickid order by md.RecordDate) 
      - row_number() over (partition by md.merrickid, md.EstGasVolMCF order by md.RecordDate) 
    From MeterDailyTb as md 

    Join CompletionTb as C 
    On c.MerrickID = md.MerrickID 
    Where md.RecordDate > '3/2/2017' --Parameter for the how far back you want to go 
    And c.DrillingTeamID in (24)--Drilling Team Selection Criteria 
) as md1 

--Where md1.merrickid = '105100' 
group by md1.merrickid, md1.EstGasVolMCF, grp 
order by cnt desc 
) 
Select * 
From cte 
Where cte.cnt > 30 
+2

哪些DBMS您使用的? –

+0

你到目前爲止嘗試過什麼? –

+0

將表格和數據作爲文本發佈[閱讀此](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking -a-question/285557#285557) –

回答

2

這是一個gaps-and-islands類型的問題,可以使用兩個row_number()來處理你的島嶼。

select 
    mid 
    , StartDate = min(RecordDate) 
    , EndDate = max(RecordDate) 
    , Volume 
    , cnt  = count(*) 
from (
    select * 
    , grp = row_number() over (partition by mid order by RecordDate) 
      - row_number() over (partition by mid, volume order by RecordDate) 
    from t 
) as s 
group by mid, volume, grp 
order by mid, StartDate 

rextester演示:http://rextester.com/JBFXNW15938

dbfiddle.uk演示:http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=82e7375b5e8d93386f362da547851de8

回報:

+------+------------+------------+--------+-----+ 
| mid | StartDate | EndDate | Volume | cnt | 
+------+------------+------------+--------+-----+ 
| 5555 | 2017-04-01 | 2017-04-01 |  1 | 1 | 
| 5555 | 2017-04-02 | 2017-04-04 |  2 | 3 | 
| 5555 | 2017-04-05 | 2017-04-25 |  3 | 21 | 
| 5555 | 2017-04-26 | 2017-04-30 |  2 | 5 | 
+------+------------+------------+--------+-----+ 

以最高數只返回一個排,使用top 1order by cnt desc

select top 1 
    mid 
    , StartDate = convert(char(10),min(RecordDate),120) 
    , EndDate = convert(char(10),max(RecordDate),120) 
    , Volume 
    , cnt  = count(*) 
from (
    select * 
    , grp = row_number() over (partition by mid order by RecordDate) 
      - row_number() over (partition by mid, volume order by RecordDate) 
    from t 
) as s 
group by mid, volume, grp 
order by cnt desc 

回報:

+------+------------+------------+--------+-----+ 
| mid | StartDate | EndDate | Volume | cnt | 
+------+------------+------------+--------+-----+ 
| 5555 | 2017-04-05 | 2017-04-25 |  3 | 21 | 
+------+------------+------------+--------+-----+ 

有關更新的問題:

row_number()

with cte as 
(
select top 1 with ties 
    md1.merrickid 
    , StartDate = convert(char(10),min(md1.RecordDate),120) 
    , EndDate = convert(char(10),max(md1.RecordDate),120) 
    , md1.EstGasVolMCF 
    , cnt  = count(*) 
From (
    Select md.MerrickID 
    , md.RecordDate 
    , md.EstGasVolMCF 
    , grp = row_number() over (partition by md.merrickid order by md.RecordDate) 
      - row_number() over (partition by md.merrickid, md.EstGasVolMCF order by md.RecordDate) 
    From MeterDailyTb as md 

    Join CompletionTb as C 
    On c.MerrickID = md.MerrickID 
    Where md.RecordDate > '3/2/2017' --Parameter for the how far back you want to go 
    And c.DrillingTeamID in (24)--Drilling Team Selection Criteria 
) as md1 

--Where md1.merrickid = '105100' 
group by md1.merrickid, md1.EstGasVolMCF, grp 
order by row_number() over (partition by mid order by count(*) desc) 
) 
Select * 
From cte 
Where cte.cnt > 30 

row_number()使用top with ties沒有top with ties

with cte as 
(
select 
    md1.merrickid 
    , StartDate = convert(char(10),min(md1.RecordDate),120) 
    , EndDate = convert(char(10),max(md1.RecordDate),120) 
    , md1.EstGasVolMCF 
    , cnt  = count(*) 
    , rn  = row_number() over (partition by mid order by count(*) desc) 
From (
    Select md.MerrickID 
    , md.RecordDate 
    , md.EstGasVolMCF 
    , grp = row_number() over (partition by md.merrickid order by md.RecordDate) 
      - row_number() over (partition by md.merrickid, md.EstGasVolMCF order by md.RecordDate) 
    From MeterDailyTb as md 

    Join CompletionTb as C 
    On c.MerrickID = md.MerrickID 
    Where md.RecordDate > '3/2/2017' --Parameter for the how far back you want to go 
    And c.DrillingTeamID in (24)--Drilling Team Selection Criteria 
) as md1 

--Where md1.merrickid = '105100' 
group by md1.merrickid, md1.EstGasVolMCF, grp 
) 
Select * 
From cte 
Where cte.cnt > 30 
    and cte.rn = 1 
+0

Hi Zim。今天rextester工作正常。我無法打開它。 –

+0

@JuanCarlosOropeza對rextester沒有任何問題。我會添加一個數據庫小提琴。 – SqlZim

+0

奇怪。 dbfiddle打開好吧,但rextester doesnt :(但不僅僅是你的,我嘗試今天創建幾個沒有成功。 –

0

請嘗試使用下面的代碼:

DECLARE @Record TABLE (MID INT,RecordDate DATE, Volume INT) 
    INSERT INTO @Record VALUES 
    (5555,'4/1/2017',1), 
    (5555,'4/2/2017',2), 
    (5555,'4/3/2017',2), 
    (5555,'4/4/2017',2), 
    (5555,'4/5/2017',3), 
    (5555,'4/6/2017',3), 
    (5555,'4/7/2017',3), 
    (5555,'4/8/2017',3), 
    (5555,'4/9/2017',3), 
    (5555,'4/10/2017',3), 
    (5555,'4/11/2017',3), 
    (5555,'4/12/2017',3), 
    (5555,'4/13/2017',3), 
    (5555,'4/14/2017',3), 
    (5555,'4/15/2017',3), 
    (5555,'4/16/2017',3), 
    (5555,'4/17/2017',3), 
    (5555,'4/18/2017',3), 
    (5555,'4/19/2017',3), 
    (5555,'4/20/2017',3), 
    (5555,'4/21/2017',3), 
    (5555,'4/22/2017',3), 
    (5555,'4/23/2017',3), 
    (5555,'4/24/2017',3), 
    (5555,'4/25/2017',3), 
    (5555,'4/26/2017',2), 
    (5555,'4/27/2017',2), 
    (5555,'4/28/2017',2), 
    (5555,'4/29/2017',2), 
    (5555,'4/30/2017',2) 

    SELECT 
     DISTINCT(Volume), 
     COUNT(*)AS [Count], 
     MID, 
     MIN(RecordDate) AS StartDate, 
     MAX(RecordDate) AS EndDate 
    FROM 
     @Record 
    GROUP BY 
     Volume,MID 
+0

感謝您花時間發佈此可能的解決方案。唯一的問題是,這並沒有考慮到我只想計算基於日期範圍的相同和連續的值。 Gaps-and-Island解決方案正是我需要的解決方案。 –

相關問題