我正在尝试根据值变为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
答案 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转到此链接,我为您创建了一个示例