SQL查询,选择值变为0的最后日期

时间:2018-07-27 03:31:07

标签: sql tsql

我正在尝试根据值变为0的最后日期选择行,但是我想不出该怎么办...这是到目前为止的sql查询...

SELECT DISTINCT TOP (1) [Date_Time]
  ,[Value1]
  ,[Status1]
  ,[Value2]
  ,[Status2]
  ,[Value3]
  ,[Status3]
  FROM TABLE NAME
  WHERE [Value1] <= 0 OR [Value2] <= 0 OR [Value3] <= 0 AND [DATE_TIME] >= [DATE_TIME]
  ORDER BY [DATE_TIME] DESC

这是示例数据。如您所见,第一个
  值在日期2.0上有2018-07-26 21:00:00.000,并且
  下一个数据是0,所以我想获得第二个数据2018-07-26 22:00:00.000
 不是第三个2018-07-26 03:00:00.000

sample data here

5 个答案:

答案 0 :(得分:0)

不确定表的外观到底是什么样,但是可以使用max函数。基本上是这样的:

select max(date) where ([Value1] <= 0 OR [Value2] <= 0 OR [Value3] <= 0)

答案 1 :(得分:0)

我认为你应该有括号

SomeClass

答案 2 :(得分:0)

将表连接到其自身,然后计算何时发生更改。在下面的示例中,它使用ID并假定ID始终始终仅递增1,如果您没有确定的增加值,则可以使用ROW_NUMBER进行此操作(例如,即使您有一个Identity列,也可以删除记录)。

CREATE TABLE sampleData
(
    id          INT            IDENTITY(1, 1) PRIMARY KEY
    ,RecordDate DATETIME       NOT NULL
    ,value      DECIMAL(18, 6) NOT NULL
)


INSERT INTO sampleData (RecordDate, value)
VALUES
('2018-07-26 21:00', 2)
,('2018-07-26 22:00', 0)
,('2018-07-26 23:00', 0)
,('2018-07-27 00:00', 0)
,('2018-07-27 01:00', 0);

WITH FindWhenRecordChanges AS
(
    SELECT      primarySampleData.*
                ,CASE
                     WHEN   primarySampleData.value = 0
                      AND   joinedSampleData.value <> 0 THEN
                         1
                     ELSE
                         0
                 END AS recordChanged
    FROM        sampleData AS primarySampleData
    LEFT JOIN   sampleData AS joinedSampleData
           ON   joinedSampleData.id + 1 = primarySampleData.id
)
SELECT  MAX(FindWhenRecordChanges.RecordDate)
FROM    FindWhenRecordChanges
WHERE   FindWhenRecordChanges.recordChanged = 1

答案 3 :(得分:0)

我会用一个不存在的方式来做。从您的描述中不清楚,如果值从零移动到其他值然后又返回,会发生什么?

假设它仍然为零,这是第一次找到它为零。

例如,如果零是库存数量,那么它将确定我们何时耗尽库存。没发现什么是我们以后要补货。

select min(date) as found_date from tab 
where value=0
and not exists(select * from tab t2 where t2.date>tab.date)

答案 4 :(得分:-1)

根据示例数据,您的查询几乎正确,只是在ASC中排序

    select Top 1 * from 
    (

       SELECT      primarySampleData.*
                ,CASE
                     WHEN   primarySampleData.value = 0
                      AND   joinedSampleData.value <> 0 THEN
                         1
                     ELSE
                         0
                 END AS recordChanged
    FROM        sampleData AS primarySampleData
    LEFT JOIN   sampleData AS joinedSampleData
           ON   joinedSampleData.id + 1 = primarySampleData.id
           ) as T

           where recordChanged =1

http://www.sqlfiddle.com/#!18/5a46b/1转到此链接,我为您创建了一个示例