2013-02-26 2 views
1

Это случай, когда казалось, что простое упражнение оказалось ничем иным, как. Я даже не смог получить свой синтаксис.SQL Query для временных интервалов. Синтаксические ошибки.

Readings таблица содержит координаты и значения времени для нескольких пользователей. Все, что я хочу в это время, организовать его как последовательные временные интервалы для каждого пользователя.

данных:

CREATE TABLE [Readings] (
user_id varchar(10), 
reading_time int, 
x decimal(10,2), 
y decimal(10,2)); 


INSERT INTO Readings VALUES 
('u1', 60, 345, 400), 
('u1', 100, 560,300), 
('u2', 35, 1024, 250), 
('u1', 90, 450, 450), 
('u3', 150, 600, 100), 
('u3', 100, 500, 125); 

Мой ошибочный код:

SELECT r.user_id, r.reading_time start_time, rm.reading_time end_time, 
     (CONVERT(varchar, r.x)+' ; '+CONVERT(varchar, r.y)) start_point, 
     (CONVERT(varchar, rm.x)+' ; '+CONVERT(varchar, rm.y)) end_point 
FROM Readings r 
JOIN (SELECT TOP 1 r2.user_id, r2.reading_time, r2.x, r2.y 
     FROM Readings r2 
     WHERE r2.user_id=r.user_id and 
      r2.reading_time < r.reading_time 
     ORDER BY r2.reading time desc) rm 
ON r.user_id=rm.user_id 
ORDER BY 1,2 desc; 

Можете ли вы указать на мою ошибку (ы) синтаксис?

+0

SQL является язык. Какие СУБД вы используете? (Я подозреваю, что SQL-Server из «TOP», но я могу ошибаться.) Вы также должны добавить версию, которую используете. –

+1

@ypercube выглядит как sql-сервер, основанный на квадратных скобках и синтаксисе 'TOP' – Taryn

+0

. Какое сообщение об ошибке вы получаете? – Melanie

ответ

2

Ну часть вашей проблемы вы ссылаетесь псевдоним таблицы внутри подзапроса, вы можете сделать только то, что если вы используете APPLY:

SELECT r.user_id, 
    r.reading_time start_time, 
    rm.reading_time end_time, 
    (CONVERT(varchar(10), r.x)+' ; '+CONVERT(varchar(10), r.y)) start_point, 
    (CONVERT(varchar(10), rm.x)+' ; '+CONVERT(varchar(10), rm.y)) end_point 
FROM Readings r 
CROSS APPLY 
(
    SELECT TOP 1 r2.user_id, r2.reading_time, r2.x, r2.y 
    FROM Readings r2 
    WHERE r2.user_id=r.user_id and 
     r2.reading_time < r.reading_time 
    ORDER BY r2.reading_time desc 
) rm 
ORDER BY 1,2 desc; 

См SQL Fiddle with Demo

3

Вы не можете использовать JOIN, то вам нужно использовать либо CROSS APPLY, либо OUTER APPLY (при условии, что SQL Server). Кроме того, добавьте длину в varchars. Теперь попробуйте это:

SELECT r.user_id, r.reading_time start_time, rm.reading_time end_time, 
     (CONVERT(varchar(10), r.x)+' ; '+CONVERT(varchar(10), r.y)) start_point, 
     (CONVERT(varchar(10), rm.x)+' ; '+CONVERT(varchar(10), rm.y)) end_point 
FROM Readings r 
OUTER APPLY (SELECT TOP 1 r2.user_id, r2.reading_time, r2.x, r2.y 
      FROM Readings r2 
      WHERE r2.user_id=r.user_id and 
        r2.reading_time < r.reading_time 
      ORDER BY r2.reading_time desc) rm 
ORDER BY 1,2 desc; 

Here is a demo для вас попробовать.

+0

Спасибо, но мне кажется, что мне не нужно ** OUTER **, так как мне нужны только реальные интервалы. –

Смежные вопросы