2017-04-17 54 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解决方案正是我需要的解决方案。 –