【发布时间】:2021-07-28 13:22:31
【问题描述】:
我做了很多搜索,我觉得这应该是一个简单的解决方案,但我什么也做不了。
我有一个包含嵌套数组的数据库表。在我取消嵌套数组并只选择我想要的列之后,我最终得到了一个如下所示的表:
SELECT time_period, name, value
FROM
TBL.TBLValues,
UNNEST(nested_name) as unnested_name
WHERE time_period > '2021-07-01 00:00:00'
AND name != "None"
ORDER BY time_period;
| row | time_period | name | value |
|---|---|---|---|
| 1 | 2021-07-01T00:00:00 | Name1 | 100 |
| 2 | 2021-07-01T00:00:00 | Name2 | 105 |
| 3 | 2021-07-01T00:05:00 | Name1 | 120 |
| 4 | 2021-07-01T00:10:00 | Name3 | 500 |
| 5 | 2021-07-01T00:15:00 | Name1 | 110 |
| 6 | 2021-07-01T00:15:00 | Name3 | 450 |
| 7 | 2021-07-01T00:20:00 | Name1 | 1000 |
我想要做的是过滤我的查询(可能通过嵌套查询?)所以我只得到 time_period 唯一的行。在上表中,我只返回第 3 行和第 4 行,因为所有其他行在同一 time_period 中都有多个名称。
我尝试了SELECT DISTINCT(period),就返回的行数而言,它基本上过滤了它,但它肯定返回具有相同time_period 的多个名称的行。我不知道为什么,我对那个函数的理解是它应该只返回 time_period 只存在一次的行。
SELECT DISTINCT(time_period)
FROM
TBL.TBLValues,
UNNEST(nested_name) as unnested_name
WHERE time_period > '2021-07-01 00:00:00'
AND name != 'None'
ORDER BY period;
我还尝试了COUNT(time_period) AS counter,然后在查询结束时尝试了HAVING counter = 1。这最接近我想要的,它返回的结果很少,我认为GROUP BY 可能做了一些奇怪的事情?每个名字只给我一个time_period,但其中一些time_periods 是重复的。理想情况下,此过滤器的下一步是获取每个唯一的time_period,然后为每个唯一的Name 过滤到最新的time_period,所以最好让它最初返回每个唯一的time_period 所以接下来我可以这样做。
SELECT COUNT(time_period) as counter, time_period, name, value
FROM(
SELECT time_period, name, value
FROM TBL.TBLValues,
UNNEST(nested_name) as unnested_name
WHERE time_period > '2021-07-01 00:00:00'
AND name != 'None')
GROUP BY name, value, time_period
HAVING counter = 1
ORDER BY time_period;
我还尝试使用 PARTITION BY 重新设计 this question 的解决方案,但根本无法让它过滤我的结果。
SELECT time_period, name, value
FROM(
SELECT time_period, name, value, ROW_NUMBER() OVER (PARTITION BY time_period ORDER BY value ASC) AS row_num
FROM TBL.TBLValues,
UNNEST(nested_name) as unested_name
WHERE time_period > '2021-07-01 00:00:00'
AND name != 'None') as all_duplicated
WHERE row_num = 1
ORDER BY time_period;
【问题讨论】:
-
为数据库平台添加标签。不,这不是 DISTINCT 的目的。它强制只检索唯一数据的一份副本,无论是否重复行。
标签: sql google-bigquery