【问题标题】:SQL Query for time intervals. Syntax errors.SQL 查询时间间隔。语法错误。
【发布时间】:2013-02-27 06:10:48
【问题描述】:

这就是一个看似简单的练习变成了不过。我什至无法弄清楚我的语法。

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;

你能指出我的语法错误吗?

【问题讨论】:

  • SQL 是语言。您使用的是哪个 DBMS? (我怀疑来自TOP 的 SQL-Server,但我可能是错的。)您还应该添加您正在使用的版本。
  • @ypercube 看起来像基于方括号和 TOP 语法的 sql server
  • 你得到什么错误信息?
  • 我在玩 SQL Fiddle 的 MS SQL Server 2008
  • 虐待狂的想法:创建一个名为 SQL 的 DMBS。

标签: sql sql-server sql-server-2008 group-by


【解决方案1】:

你不能像那样使用JOIN,你需要使用CROSS APPLYOUTER 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你试试。

【讨论】:

  • 谢谢,但我似乎不需要 OUTER,因为我只需要真正的间隔。
【解决方案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

【讨论】:

    猜你喜欢
    • 2023-02-21
    • 2020-02-14
    • 1970-01-01
    • 2021-06-17
    • 2018-10-04
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多