帮助纠正SQL错误

帮助纠正SQL错误,sql,Sql,我正试图解决这个问题。我有以下数据: 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

我正试图解决这个问题。我有以下数据:

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;

我认为你太努力了。应该是这样的:

SELECT MIN(START_DATE) AS FromDate, MAX(END_DATE) AS ToDate, KEY, VALUE
FROM  KEY_VALUE
GROUP BY KEY, VALUE

这个查询似乎产生了正确的结果,尽管它指出您在示例输出“2011年5月27日”中漏掉了一行。。。2011年5月27日。。。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子句的min date记录,查找前一天没有其他记录的记录。然后todate子查询通过查找它与min date之间的天数,然后查找两者之间的记录数并确保它们匹配,从而获得最大的日期记录。当然,这是假设表中的记录是不同的


但是,如果您正在处理一个庞大的表,您最好的选择可能是按键、id、日期对记录进行排序,然后在循环并查找要更改的值时,使用光标以编程方式查找最小和最大日期,然后将它们放入一个新表中,无论是real还是temp,以及您可能需要对其他字段进行的任何其他计算。

您的数据有缺陷,因为无法确定行的顺序,因为您可以在同一天有多行。如果没有时间,或者更好,没有表示时间顺序的id,我们给您的任何解决方案都是有缺陷的。@Erik它实际上完全是按日期id排序的;-我不确定这是故意的还是偶然的。@Erik实际上id是不同的。同一天,我们可以有不同的ID和值。为什么2011年5月27日2011年5月27日120?如果不是2011年5月27日2011年5月27日你是说id是当天的记录号码吗?这还不清楚。你需要多解释。我们不能仅仅凭猜测就从如此短的样本中获得所有信息!我的下一个问题是,如果一个值在几天内没有变化,您是在寻找每天一行,还是一行跨越整个范围?我相信他是在寻找连续的几天。如果27号没有记录,您的查询结果将是26-28,对吗?我想知道您是否可以添加类似的内容来强制执行span HAVING EXISTS查询以查找具有相同键/值的高一天的日期,或者EXISTS查询以查找具有相同键/值的高一天的日期,以使第二个键/值更低。。。我会把它作为答案贴出来