Android Studio - 房间查询结果与预期不同

Android Studio - Room query different result than expected

我很难理解为什么 相同的查询 相同的数据库 在我的本地测试环境(我的电脑)上是正确的,在我的 device/emulator.

上是错误的

数据库完全一样(从模拟器复制到电脑)。

SELECT * FROM (
    SELECT name, max(date_col) as date_col, value FROM tbl
    WHERE date_col <= '2021-06-30'
    GROUP BY name
    UNION 
    SELECT name, min(date_col) as date_col, value FROM tbl
    GROUP BY name
    ORDER BY date_col DESC
)
GROUP BY name

table 的架构是 (id, date_col, name, value)

我想要做的是 select 日期与提供的日期最近的所有行。我不太确定这是最好的方法,所以欢迎任何建议

在我的计算机中尝试此查询时(SQLITE v3.27.2)它按预期工作并且在 device/emulator 上测试时(尝试了多个 API 级别,例如 23、27、28)他们都失败了。

编辑: Table数据:

|name |date_col  |value|
|-----|----------|-----|
|NAME6|2021-06-29|71   |
|NAME7|2021-06-29|80   |
|NAME1|2021-06-29|2925 |
|NAME4|2021-06-29|182.0|
|NAME2|2021-06-29|365  |
|NAME3|2021-06-29|81.0 |
|NAME5|2021-06-29|0.25 |
|NAME7|2021-06-27|81.0 |
|NAME1|2021-06-27|3000 |
|NAME5|2021-06-01|0.35 |
|NAME6|2021-06-01|68.0 |
|NAME5|2021-06-28|0.15 |

设备上的结果(日期 2021-06-28):

|name |date_col  |value|
|-----|----------|-----|
|NAME1|2021-06-27|3000 |
|NAME2|2021-06-29|365.0|
|NAME3|2021-06-29|81.0 |
|NAME4|2021-06-29|182.0|
|NAME5|2021-06-01|0.35 |
|NAME6|2021-06-01|68.0 |
|NAME7|2021-06-27|81.0 |

计算机上的结果(日期 2021-06-28):

|name |date_col  |value|
|-----|----------|-----|
|NAME1|2021-06-27|3000 |
|NAME2|2021-06-29|365.0|
|NAME3|2021-06-29|81.0 |
|NAME4|2021-06-29|182.0|
|NAME5|2021-06-28|0.15 |
|NAME6|2021-06-01|68.0 |
|NAME7|2021-06-27|81.0 |

如您所见,在此示例中,不同之处在于 name5,它应该是 0.15,但由于某种原因在设备上它是 0.35。

造成这些差异的原因可能是什么?

非常感谢!

SQLite 允许使用 SELECT *GROUP BY 的语句,但结果行是任意的。

如果你想在较低的 API 级别使用它,你不能使用 window 可以轻松解决问题的函数,如下所示:

SELECT name, date_col, value 
FROM (
  SELECT *, ROW_NUMBER() OVER (
              PARTITION BY name 
              ORDER BY date_col < '2021-06-28' DESC,
                       abs(strftime('%s', date_col) - strftime('%s', '2021-06-28'))
                       
            ) rn
  FROM tbl
)
WHERE rn = 1
ORDER BY name;

您可以使用相关子查询:

SELECT t1.name, t1.date_col, t1.value 
FROM tbl t1
WHERE t1.date_col = (
  SELECT t2.date_col 
  FROM tbl t2
  WHERE t2.name = t1.name 
  ORDER BY date_col < '2021-06-28' DESC,
           abs(strftime('%s', t2.date_col) - strftime('%s', '2021-06-28'))
  LIMIT 1
)
ORDER BY name;

参见demo