Получить значение этого же столбца из следующей строки, если текущее значение столбца равно нулю - PullRequest
0 голосов
/ 08 июля 2019

У меня есть таблица, и я хочу выбрать один столбец, например, если эта запись не найдена (потому что у меня есть объединения с другими таблицами) или существует, но она не равна выбранному значению этого же столбца из следующей строки.Я пытался использовать функции isnull и coalesce, но я не могу получить значение следующей строки.Буду признателен за любую помощь или ссылку.

Вот мой запрос до сих пор

Select 
  (select top 1 OpenPrice from #tbltempData where Dated=D.Dated) [Open],
  ISNULL((select top 1 ClosePrice from #tbltempData where Dated= DATEADD(hour,@Interval-1, D.Dated)),
  (select top 1 ClosePrice from #tbltempData where Dated= DATEADD(hour,0, D.Dated))) [Close], 
  [Min],[Max],Dated
from #tbltempData2 D
Order BY Dated Asc

Открытый столбец имеет нулевые значения.

вот Скриншот моих образцов данных enter image description here

и здесь вывод получаю enter image description here

Подробности: поскольку у меня есть записи в моих данных выборки на дату '28 /06/2019 'и время для первой записи - 9 часов утра, и я группирую свои данные за 2 часа, поэтому после группировки моей первой групповой записи с той же датой - 8 часов утра, и поскольку у меня нет значения для этого времени в выборочных данных, поэтому я получаю нулевое значениеценности.чтобы избежать этого сценария, я хочу получить значение OpenPrice, где время равно 9:00 (в выборочных данных) той же даты, потому что время находится в той же группе.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Если вы хотите, чтобы «следующий ряд» всегда был больше текущего времени

[Open] = (
       select top 1 OpenPrice 
       from #tbltempData t 
       where DATEDIFF(day,t.Dated,D.Dated) = 0   -- make sure the price for same day
         AND t.Dated>=D.Dated 
       ORDER BY t.Dated ASC
) 

Если вы хотите, чтобы «следующий ряд» был ближайшим доступным временным интервалом

 [Open] = (
       select top 1 OpenPrice 
       from #tbltempData t 
       where DATEDIFF(day,t.Dated,D.Dated) = 0   -- make sure the price for same day
       ORDER BY ABS(DATEDIFF(minute,t.Dated,D.Dated)) ASC
) 
0 голосов
/ 08 июля 2019

Я думаю, что коррелированный подзапрос делает то, что вы хотите:

select d.*,
       (select top (1) ClosePrice
        from #tbltempData td
        where td.Dated <= D.Dated
        order by td.Dated desc
       ) as ClosePrice
from #tbltempData2 d
order by dated Asc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...