Sql 根据不同的列值选择行

Sql 根据不同的列值选择行,sql,oracle,Sql,Oracle,我在表示例中有以下数据。我正在使用Oracle数据库 我需要根据SUBSTR(第3、1、10列)值提取不同记录的计数 例如: 在第一排,, column3的SUBSTR(column3,1,10)值为2017-07-27 在第二排, column3的SUBSTR(column3,1,10)值为2017-07-27,与第一行相同 第三行中,column3的SUBSTR(column3,1,10)值为2017-08-10,与前两行不同 因此,基于不同的SUBSTR(第3、1、10列)值,计数应返回

我在表
示例中有以下数据。我正在使用Oracle数据库


我需要根据
SUBSTR(第3、1、10列)
值提取不同记录的计数

例如:

在第一排,,
column3
SUBSTR(column3,1,10)
值为
2017-07-27

在第二排,
column3
SUBSTR(column3,1,10)
值为
2017-07-27
,与第一行相同

第三行中,
column3
SUBSTR(column3,1,10)
值为
2017-08-10
,与前两行不同

因此,基于不同的
SUBSTR(第3、1、10列)
值,计数应返回为
2


有人能帮我吗?

由于您似乎将时间戳值存储为字符串(您不应该这样做,应该将它们存储为时间戳),因此您可以将它们转换为时间戳,然后将时间组件截断到一天的开始:

select count(distinct SUBSTR(column3, 1,10))
from sample
SELECT   COUNT( DISTINCT TRUNC( TO_TIMESTAMP( column3, 'YYYY-MM-DD-HH24.MI.SS.FF6' ) ) )
           AS num_days
FROM     your_table
但您也可以只使用字符串值:

SELECT   COUNT( DISTINCT SUBSTR( column3, 1, 10 ) ) AS num_days
FROM     your_table
如果将表转换为将其存储为时间戳,则只需使用:

SELECT   COUNT( DISTINCT TRUNC( column3 ) ) AS num_days
FROM     your_table

由于您似乎将时间戳值存储为字符串(您不应该这样做,并且应该将它们存储为时间戳),因此您可以将它们转换为时间戳,然后将时间组件截断为一天的开始:

SELECT   COUNT( DISTINCT TRUNC( TO_TIMESTAMP( column3, 'YYYY-MM-DD-HH24.MI.SS.FF6' ) ) )
           AS num_days
FROM     your_table
但您也可以只使用字符串值:

SELECT   COUNT( DISTINCT SUBSTR( column3, 1, 10 ) ) AS num_days
FROM     your_table
如果将表转换为将其存储为时间戳,则只需使用:

SELECT   COUNT( DISTINCT TRUNC( column3 ) ) AS num_days
FROM     your_table

如果
第3列
的数据类型为
时间戳
,为什么不获取
日期
部分的
计数
,而不是执行
子序列
。即使它是字符串,尝试将其转换为
时间戳
并应用建议的选项如果
列3
的数据类型为
时间戳
,为什么不获取
日期
部分的
计数
,而不是执行
子序列
。即使是字符串,也尝试将其转换为
时间戳
,并应用建议的选项,这是一个简单而完美的解决方案+1对于您的快速响应,这是一个简单而完美的解决方案+1.为了你快速反应的眼睛。。我们在数据库中存储为字符串,我不应该改变设计。谢谢你的解释+1.是的。。我们在数据库中存储为字符串,我不应该改变设计。谢谢你的解释+我同意。