在不同的列中按年和月进行sql筛选

yacmzcpb  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(479)

我使用的数据在单独的列中包含日-月-年,我想使用月和年组合创建一个过滤器。举个例子:

transaction_id | customer | amount | day | month | year
---------------+----------+--------+-----+-------+-------
1                100         1000     01    05     2019
2                100          500     24    11     2018
3                100         2700     26    10     2018
4                205          800     19    11     2020
5                333         8000     05    05     2020
6                333          500     02    10     2019
7                333          200     19    12     2018

如果我只想回来 transaction_id 从2019年1月开始,是否会通过类似于月+年的concat的方式来实现,然后使用别名创建一个新列?我试过做这样的事,但就在那一年,它又回来了:

SELECT transaction_id, concat(MONTH, YEAR) AS FULLDATE
FROM sample_table

它以201901(2019年1月)的形式返回fulldate值,但我想知道这是否确实是正确的方法。
此外,如果是这样,我如何在where子句中使用这个fulldate:

SELECT transaction_id, concat(MONTH, YEAR) AS FULLDATE
FROM sample_table
WHERE FULLDATE >= 201901

如何将其构建到子查询中以使用别名?或者我应该试试having子句之类的吗?我两个都试过了,但都没能正常运行。也许还有更好的办法?

djp7away

djp7away1#

我建议改为使用数学函数:

where year * 100 + month >= 201901

这是假设 year 以及 month 是数字——这似乎是合理的。如果它们是字符串,请使用字符串比较:

where concat(year, month) >= '201901'

注意:如果列是数字,这将产生 20191 一月,这不是你想要的。
在sql azure中,您实际上可以将其定义为计算列:

alter table t add yyyymm as (year * 100 + month);

(或 concat() 如果列是字符串。)

相关问题