Самосоединение таблицы для получения даты и времени из следующей строки в виде столбца в текущей строке Transact SQL - PullRequest
0 голосов
/ 27 декабря 2011

Есть ответы на другие вопросы, подобные этому, но главная проблема здесь в том, что rowID (objectID и т. Д.) Нет, так что таблица может быть присоединена самостоятельно.

Мой текущий кодработает нормально, однако, поскольку он должен интерпретироваться INSQL (связанный сервер), по какой-то причине что-либо с ROW_NUMBER() не будет работать

Интересно, если у кого-то есть опыт в выполнении того же действия, что и код ниже,однако НЕ использовать ROW_NUMBER(), COUNT(*), TOP(*) или тому подобное?

РЕДАКТИРОВАТЬ: просто упомяните, что из-за ограничений на связанный сервер, любой возможный хитрый трюк должен быть сделан за пределами цитируемого запроса«ВЫБРАТЬ ...» ... Это довольно болезненно: (

Большое спасибо заранее

SELECT TOP 20000
  StartQ.DateTime AS StartTime,
  EndQ.DateTime AS EndTime,
  StartQ.PlyRemaining,
  StartQ.PlyTarget,
  StartQ.PlyNumber as PlyNumber,
  StartQ.PileNumber AS PileNumber,
  'ST3P' AS STACKER_ID
FROM
( SELECT TOP 20000 ROW_NUMBER() OVER(ORDER BY [DateTime] ASC) RowNum, *
FROM 
OpenQuery(INSQL, 'SELECT [DateTime], 
PlyRemaining = [DA2.N_SMSP_ST3P_PLYS_TO_STACK],
PlyTarget = [DA2.N_SMSP_ST3P_PLYS],
PlyNumber = [DA2.N_SMSP_ST3P_PLYS] - [DA2.N_SMSP_ST3P_PLYS_TO_STACK],
PileNumber = [DA2.N_ST3P_PILENUM]
FROM WideHistory
WHERE DateTime > "2011-06-01 00:00:00"
AND DateTime <= "2011-12-12 00:00:00"
AND wwRetrievalMode = "Delta"
')  ) StartQ INNER JOIN 
(SELECT TOP 20000 ROW_NUMBER() OVER(ORDER BY [DateTime] ASC) RowNum, *
FROM 
OpenQuery(INSQL, 'SELECT [DateTime], 
PlyRemaining = [DA2.N_SMSP_ST3P_PLYS_TO_STACK],
PlyTarget = [DA2.N_SMSP_ST3P_PLYS],
PlyNumber = [DA2.N_SMSP_ST3P_PLYS] - [DA2.N_SMSP_ST3P_PLYS_TO_STACK],
PileNumber = [DA2.N_ST3P_PILENUM]
FROM WideHistory
WHERE DateTime > "2011-06-01 00:00:00"
AND DateTime <= "2011-12-12 00:00:00"
AND wwRetrievalMode = "Delta"
') 
) EndQ ON EndQ.RowNum = StartQ.RowNum + 1

Результаты выглядят как

StartTime           EndTime             PlyRemaining PlyTarget PlyNumber PileNumber STACKER_ID
------------------- ------------------- ------------ --------- --------- ---------- ----------
2011-06-01 00:18:13 2011-06-01 03:20:25 NULL         0         NULL      NULL       ST3P
2011-06-01 03:20:25 2011-06-01 03:40:42 0            0         0         NULL       ST3P
2011-06-01 03:40:42 2011-06-01 03:40:48 0            0         0         0          ST3P
2011-06-01 03:40:48 2011-06-02 02:30:37 0            0         0         12         ST3P
2011-06-02 02:30:37 2011-06-03 12:25:03 0            0         0         0          ST3P
2011-06-03 12:25:03 2011-06-03 13:58:22 0            0         0         13         ST3P
2011-06-03 13:58:22 2011-06-03 19:29:43 0            0         0         0          ST3P
2011-06-03 19:29:43 2011-06-03 19:49:08 0            0         0         13         ST3P

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

Вот мой дубль:

1) выбирая из вашего openquery в качестве исходной таблицы, добавьте / агрегируйте все свои числа и сгруппируйте их по значению datetime, чтобы у вас были уникальные datetime, и перенесите их в таблицу Temp, выполнив выбор в.

2) теперь, когда у вас есть уникальные значения даты и времени, перейдите к получению следующего значения даты и времени, используя метод по вашему выбору, выбирая из временной таблицы. Используя временную таблицу (или эквивалентное хранилище по выбору), вы избавляете себя от необходимости выполнения базой данных двух выполнений одного и того же запроса.

3) Затем я бы взял следующее значение datetime (в SQL Server 2008):

SELECT T1.*, T2.EndTime from #TheTempTable T1
OUTER APPLY (SELECT TOP 1 X.StartTime as EndTime from #TheTempTable X WHERE T1.StartTime < X.StartTime ORDER BY X.StartTime ASC) T2

Надеюсь, это поможет

0 голосов
/ 27 декабря 2011

Если таблица WideHistory имеет какой-либо уникальный ключ, то вы можете использовать подзапрос для извлечения значения «столбец следующей строки» без необходимости ROW_NUMBER()

НО

первый столбец уникального ключа должен быть вашим столбцом DateTime

UPD:

Поскольку DateTime объявил уникальным, вы можете переписать скрипт:

SELECT TOP 20000
  StartQ.DateTime AS StartTime,
  StartQ.EndTime AS EndTime,
  StartQ.PlyRemaining,
  StartQ.PlyTarget,
  StartQ.PlyNumber as PlyNumber,
  StartQ.PileNumber AS PileNumber,
  'ST3P' AS STACKER_ID
FROM
( SELECT 
    *
FROM 
OpenQuery(INSQL, 'SELECT [DateTime], 
PlyRemaining = [DA2.N_SMSP_ST3P_PLYS_TO_STACK],
PlyTarget = [DA2.N_SMSP_ST3P_PLYS],
PlyNumber = [DA2.N_SMSP_ST3P_PLYS] - [DA2.N_SMSP_ST3P_PLYS_TO_STACK],
PileNumber = [DA2.N_ST3P_PILENUM]
(
    SELECT TOP 1 [DateTime]
    FROM WideHistory
    WHERE DateTime > HostTab.DateTime
    AND wwRetrievalMode = "Delta"
    ORDER BY [DateTime]
) AS ENdTime
FROM WideHistory as HostTab
WHERE DateTime > "2011-06-01 00:00:00"
AND DateTime <= "2011-12-12 00:00:00"
AND wwRetrievalMode = "Delta"
')  ) StartQ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...