帮助更正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-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,日期对记录进行排序,然后在遍历并查找要更改的值时使用游标以编程方式找到最小和最大日期,然后将其推入到新表中,无论是实数表还是温度表,以及在此过程中可能需要对其他字段进行的任何其他计算。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...