2

我是一名学生,正在做一个项目,我必须使用 SQLite,但是我是 SQLite 的新手。我在下面描述了我的问题。

我有一个表格(包含 60000 行),其格式如下所示。

Date_Time           Country_City Temperature
4-10-2012 12:10:10  USA_NYC        20
4-10-2012 12:10:10  USA_LA         17
4-10-2012 12:10:10  USA_DC         19
4-10-2012 12:40:10  USA_LA         18
4-10-2012 12:40:10  USA_DC         18

我必须如下所示对表格进行排序和创建,如果数据在 NYC 中丢失,则如果不是“NaN”,则必须加载以前的数据。

Date_Time         USA_NYC USA_LA USA_DC
4-10-2012 12:10:10 20      17     19
4-10-2012 12:40:10 20      18     18

你能告诉我如何创建它,我可以排序和排序,但我不知道如何在 SQLite 中创建这样的。我将不胜感激任何建议。

4

2 回答 2

1

对于给定的时间戳和城市,以下查询获取该时间或之前的最新温度:

SELECT Temperature AS USA_NYC
FROM mytable
WHERE Country_City = 'USA_NYC'
  AND Date_Time LIKE '4-10-2012 %'
  AND Date_Time <= '4-10-2012 12:40:10'
  AND Temperature IS NOT NULL
ORDER BY Date_Time DESC
LIMIT 1

(请注意,如果您使用 SQLite支持的日期/时间格式Date_Time之一,则可以简化比较。)

我们还得到了我们想要一些温度的所有时间戳:

SELECT DISTINCT Date_Time FROM mytable

现在我们结合这两个查询来获取每个时间戳的 NYC 值:

SELECT timestamps.Date_Time,
       (SELECT Temperature
        FROM mytable tvalues
        WHERE tvalues.Country_City = 'USA_NYC'
          AND tvalues.Date_Time LIKE substr(timestamps.Date_Time, 1, 10) || '%'
          AND tvalues.Date_Time <= timestamps.Date_Time
          AND tvalues.Temperature IS NOT NULL
        ORDER BY tvalues.Date_Time DESC
        LIMIT 1) AS USA_NYC
FROM (SELECT DISTINCT Date_Time
      FROM mytable) timestamps

LA添加和列DC作为练习。(不可能从Country_City值自动生成这些列;SQLite 没有数据透视表函数。)

于 2012-10-06T12:47:53.897 回答
0

@Cl:谢谢你的澄清。练习的答案是

选择时间戳。日期时间,

   (SELECT Temperature
    FROM mytable tvalues
    WHERE tvalues.Country_City = 'USA_NYC'
      AND tvalues.Date_Time LIKE substr(timestamps.Date_Time, 1, 10) || '%'
      AND tvalues.Date_Time <= timestamps.Date_Time
      AND tvalues.Temperature IS NOT NULL
    ORDER BY tvalues.Date_Time DESC
    LIMIT 1) AS USA_NYC, 
   (SELECT Temperature FROM mytable tvalues WHERE tvalues.Country_City = 'USA_LA'
      AND tvalues.Date_Time LIKE substr(timestamps.Date_Time, 1, 10) || '%'
      AND tvalues.Date_Time <= timestamps.Date_Time
      AND tvalues.Temperature IS NOT NULL
    ORDER BY tvalues.Date_Time DESC
    LIMIT 1) AS USA_LA,     SELECT Temperature
    FROM mytable tvalues
    WHERE tvalues.Country_City = 'USA_DC'
      AND tvalues.Date_Time LIKE substr(timestamps.Date_Time, 1, 10) || '%'
      AND tvalues.Date_Time <= timestamps.Date_Time
      AND tvalues.Temperature IS NOT NULL
    ORDER BY tvalues.Date_Time DESC
    LIMIT 1) AS USA_DC,

FROM (SELECT DISTINCT Date_Time FROM mytable) 时间戳

这是所需的解决方案,还是您期望有任何不同的更快的解决方案?

于 2012-10-08T15:21:09.690 回答