问题描述
|
我正在尝试解决此查询。我有以下数据:
Input
Date Id Value
25-May-2011 1 10
26-May-2011 1 10
26-May-2011 2 10
27-May-2011 1 20
27-May-2011 2 20
28-May-2011 1 10
我需要查询和输出为:
Output
FromDate ToDate Id Value
25-May-2011 26-May-2011 1 10
26-May-2011 26-May-2011 2 10
27-May-2011 27-May-2011 1 20
28-May-2011 28-May-2011 1 10
我尝试了此sql,但没有得到正确的结果:
SELECT START_DATE,END_DATE,A.KEY,B.VALUE FROM
(
SELECT MIN(DATE) START_DATE,KEY,VALUE
FROM
KEY_VALUE
GROUP
BY KEY,VALUE
) A INNER JOIN
(
SELECT MAX(DATE) END_DATE,VALUE
) B ON A.KEY = B.KEY AND A.VALUE = B.VALUE;
解决方法
我认为您正在努力。应该更像这样:
SELECT MIN(START_DATE) AS FromDate,MAX(END_DATE) AS ToDate,KEY,VALUE
FROM KEY_VALUE
GROUP BY KEY,VALUE
,尽管该查询指出您在示例输出中错过了一行'27 -May-2011 ... 27-May-2011 ... 2 ... 20 \',但该查询似乎产生了正确的结果。
select id,[value],date as fromdate,(
select top 1 date
from key_value kv2
where id = kv.id
and [value] = kv.[value]
and date >= kv.date
and datediff(d,kv.date,date) = (
select count(*)
from key_value
where id = kv.id
and [value] = kv.[value]
and date > kv.date
and date <= kv2.date
)
order by date desc
) as todate
from key_value kv
where not exists (
select *
from key_value
where id = kv.id
and [value] = kv.[value]
and date = dateadd(d,-1,kv.[date])
)
首先,它使用where子句查找最短日期记录,查找前一天没有其他记录的记录。然后,todate子查询通过找到日期和最小日期之间的天数,然后找到两者之间的记录数并确保它们匹配,来获得最大的日期记录。当然,这假定表中的记录是不同的。
但是,如果要处理海量表,最好的选择可能是按键,id,日期对记录进行排序,然后在遍历并查找要更改的值时使用游标以编程方式找到最小和最大日期,然后将其推入到新表中,无论是实数表还是温度表,以及在此过程中可能需要对其他字段进行的任何其他计算。