QQ:按日期识别第一条记录 [英] QQ: identify the first record by date

查看:147
本文介绍了QQ:按日期识别第一条记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述





我希望能够在日期范围内按日期查找第一张和最后一张记录。我想在View而不是存储过程中执行此操作。



任何想法?



伪代码:

 创建 查看 VW_TEST 
AS

TESTDATA AS
选择
cast(getdate() date as date
union 全部
选择 dateadd(day,-1, datetime
来自日期
其中 datetime>(dateadd(day,-120,cast(cast(getdate() as date as datetime )) )

选择
t0。 date as firstInRange,
t1。 date as lastInRange
来自 TESTDATA t0
left join TESTDATA t1 t1。 date = cast(getdate() as date - 今天
其中 t0。日期 = [first date ]

GO

选择 firstInRange,lastInRange
来自 VW_TEST
其中 firstInRange> @ RangeStart
lastInRange< @ RangeEnd





我甚至不确定这在我的意义上是否合理头。我会同时为它写一个SP,但最好有一个视图,因为它可以很好地插入我当前的框架。



让我知道你在想什么



谢谢^ _ ^

Andy



为了澄清,示例中的数据是假的。实际数据更加无序。每个日期都可能有一个记录,但在可能的情况下我们可能只有最后一周,或者数据可能不完整。



这是我写的SP在它的位置:



  ALTER   PROCEDURE  [dbo]。[SP_dashboard_list] 

@ startdate as date
@ enddate as date

AS

记录 as
select r。*,ROW_NUMBER() over partition by r.id order by datetime as row
来自 VW_results r
其中​​ r。 datetime > = < span class =code-sdkkeyword> @ startdate
r。 datetime < = @ enddate
),
首先 as
选择 * 来自记录其中 row = 1
),
lastrecord as
选择 max(行)作为行,id 来自记录< span class =code-keyword> group by id
),
最后 as
select r。* 来自记录r
内部 join lastrecord lr on r.id = lr.id r.row = lr.row


SELECT
k.id,
k.page_id,
m.title,
k.phrase,

f.avg_r as init,
l.avg_r as curr

FROM pages m
inner 加入 dbo.ks k on m.page_id = k.page_id
left 外部 加入首先f k .id = f.id
left 外部 join last l on k.id = l.id
其中​​
k.removed_date null





我希望清除它:S

解决方案

你不能有参数化视图,但是表值函数可以工作。



尝试这样的事情:

 创建 功能 dbo.TVF_dashboard_list 

@ StartDate As < span class =code-keyword> date ,
@ EndDate As date

返回
作为
返回

WITH 条记录 As

SELECT
ROW_NUMBER() OVER PARTITION BY R.id ORDER BY R。[ datetime ]) As RowAsc,
ROW_NUMBER() OVER PARTITION BY R.id < span class =code-keyword> ORDER BY R。[ datetime ] DESC 作为 RowDesc,
R.id,
R.avg_r
FROM
dbo.VW_results As R
WHERE
R。[ datetime ] 介于 @ StartDate @EndDate

SELECT
K.id,
K.page_id,
M.title,
K.phrase,
F.avg_r 作为 init,
L.avg_r As curr
FROM
dbo.pages As M
INNER JOIN dbo.ks As K ON K.page_id = M.page_id
LEFT JOIN 条记录作为 F ON F.id = K.id F.RowAsc = 1
LEFT JOIN 记录作为 L ON L.id = K.id L.RowDesc = 1
WHERE
K.removed_date Null
);



使用它非常简单:

  SELECT  
id,
page_id,
title,
短语,
init,
curr
FROM
db o.TVF_dashboard_list( @ StartDate @ EndDate
;


Hi,

I want to be able to find the first and last record by date from a date range. I would like to do this in a View rather than a stored proc.

Any ideas?

Pseudo code:

CREATE VIEW VW_TEST
AS

with TESTDATA AS(
  select
      cast(getdate() as date) as date
  union all
      select dateadd(day, -1, datetime)
      from dates
      where datetime>(dateadd(day,-120,cast(cast(getdate() as date) as datetime)))
)
select 
   t0.date as firstInRange,
   t1.date as lastInRange
from TESTDATA t0 
left outer join TESTDATA t1 on t1.date = cast(getdate() as date) --today
 where t0.date = [first date]

GO

select firstInRange,lastInRange
from VW_TEST
where firstInRange > @RangeStart 
and   lastInRange < @RangeEnd



I'm not even sure this makes sense in my head. I'll write up an SP for it in the mean time, but it would be good to have a view as it would slot nicely into my current framework.

Let me know what you think

Thanks ^_^
Andy

To clarify, the data in the example is fake. The actual data is much more disordered. There may well be a record for every date but in may cases we may only have the last week, or the data may be patchy.

Here is the SP I wrote in it's place:

ALTER PROCEDURE [dbo].[SP_dashboard_list]
(
@startdate as date,
@enddate as date
)
AS

with records as (
     select r.* ,ROW_NUMBER() over (partition by r.id order by datetime) as row
       from VW_results r
      where r.datetime >= @startdate
        and r.datetime <= @enddate
   ),
first as(
   select * from records where row = 1
) ,
lastrecord as (
	select max(row) as row, id from records group by id
),
last as (
   select r.* from records r
	inner join lastrecord lr on r.id = lr.id and r.row = lr.row
)

SELECT
	k.id,
	k.page_id,
	m.title,
	k.phrase,

	f.avg_r as init,
	l.avg_r as curr
	
FROM  pages m
	  inner join dbo.ks k on m.page_id = k.page_id
	  left outer join first f on k.id = f.id
	  left outer join last l on k.id = l.id
where 
	k.removed_date is null



I hope that clears it up :S

解决方案

You can't have a parameterized view, but a table-valued function would work.

Try something like this:

CREATE FUNCTION dbo.TVF_dashboard_list
(
    @StartDate As date,
    @EndDate As date
)
Returns Table
As
Return
(
    WITH records As
    (
        SELECT
            ROW_NUMBER() OVER (PARTITION BY R.id ORDER BY R.[datetime]) As RowAsc,
            ROW_NUMBER() OVER (PARTITION BY R.id ORDER BY R.[datetime] DESC) As RowDesc,
            R.id,
            R.avg_r
        FROM
            dbo.VW_results As R
        WHERE
            R.[datetime] Between @StartDate And @EndDate
    )
    SELECT
        K.id,
        K.page_id,
        M.title,
        K.phrase,
        F.avg_r As init,
        L.avg_r As curr
    FROM
        dbo.pages As M
        INNER JOIN dbo.ks As K ON K.page_id = M.page_id
        LEFT JOIN records As F ON F.id = K.id And F.RowAsc = 1
        LEFT JOIN records As L ON L.id = K.id And L.RowDesc = 1
    WHERE
        K.removed_date Is Null
);


Using it is fairly simple:

SELECT
    id,
    page_id,
    title,
    phrase,
    init,
    curr
FROM
    dbo.TVF_dashboard_list(@StartDate, @EndDate)
;


这篇关于QQ:按日期识别第一条记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆