1

これは、一見単純な運動が他の何物にもならない場合です。構文をまっすぐにすることすらできませんでした。

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;

私の構文エラーを指摘していただけますか?

4

2 に答える 2

3

そのようなものを使用することはできません。または(SQL Serverを想定)JOINのいずれかを使用する必要があります。また、varcharsに長さを追加してください。今、これを試してください:CROSS APPLYOUTER 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 
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;

これがあなたが試すためのデモです。

于 2013-02-26T22:09:57.807 に答える
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 FiddlewithDemoを参照してください

于 2013-02-26T22:10:27.797 に答える