我正在尝试解决此查询。我有以下数据:
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, KEY, VALUE
FROM
KEY_VALUE
GROUP
BY KEY, VALUE
) B ON A.KEY = B.KEY AND A.VALUE = B.VALUE;
答案 0 :(得分:0)
我认为你太努力了。应该更像这样:
SELECT MIN(START_DATE) AS FromDate, MAX(END_DATE) AS ToDate, KEY, VALUE
FROM KEY_VALUE
GROUP BY KEY, VALUE
答案 1 :(得分:0)
此查询似乎产生了正确的结果,但它指出您错过了示例输出'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,日期对记录进行排序,然后使用光标以编程方式查找循环结束时的最小和最大日期,并查找要更改的值,然后将它们推入新表中,无论是真实的还是临时的,以及沿途的其他字段可能需要进行的任何其他计算。