Sql 按年份和月份过滤,当它们';我们在不同的栏目里

Sql 按年份和月份过滤,当它们';我们在不同的栏目里,sql,apache-spark,apache-spark-sql,Sql,Apache Spark,Apache Spark Sql,我使用的数据在单独的列中包含日-月-年,我想使用月和年组合创建一个过滤器。下面是一个例子: transaction_id | customer | amount | day | month | year ---------------+----------+--------+-----+-------+------- 1 100 1000 01 05 2019 2 100 500

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

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  
如果我只想返回从2019年1月起发生的
事务id
,这会通过类似于月+年的concat的方式来完成,然后用别名创建一个新列吗?我试着做类似的事情,但就在这一年里,它不断地出现:

SELECT transaction_id, concat(MONTH, YEAR) AS FULLDATE
FROM sample_table
这将以201901(2019年1月)的形式返回FULLDATE值,但我想知道这是否确实是正确的方法

此外,如果是这样,我如何在WHERE子句中使用此完整日期:

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

如何将其构建到子查询中以使用别名?或者我应该试试像HAVING子句这样的东西吗?我两个都试过了,但都没能正常运行。也许有更好的方法吗?

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

where year * 100 + month >= 201901
这假设
是数字,这似乎是合理的。如果它们是字符串,请使用字符串比较:

where concat(year, month) >= '201901'
注意:如果列是数字,这将为1月份生成
20191
,这不是您想要的

在SQL Azure中,您实际上可以将其定义为计算列:

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

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

是日期和月份文本字段吗?前导的零意味着它们是。这是一个很好的观点,它们是字符串值,没有前导,必须在WHERE子句中重复计算。另一种方法是不连接并为每个字段提供自己的参数。无论哪种方式,最有可能的查询都会理解参数是数字的,并自动将字符串转换为数字,这样就可以进行比较了。这真是聪明:where year*100+month>=201901。我检查了年/月列类型,它们是字符串。但是,看起来这两种方法都有效。我使用count(不同的事务\u id)运行了这两个实例,它们是相同的。你觉得这是对的还是有更好的方法让我来验证?@David。两者都有效。使用
+
会对数字进行不必要的隐式转换。如果它们是字符串,请使用字符串版本。