我需要计算每个日期的唯一ID数。有没有办法仅使用SQL而不使用PL / SQL?
func classFromString(className: String) -> AnyClass! {
let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String;
let class1: AnyClass = NSClassFromString("\(namespace).\(className)")!;
return class1;
}
我需要一个create table test (
id number(10),
start_date timestamp,
end_date timestamp
);
insert into test values(1, to_date('01.01.2019', 'dd.mm.yyyy'), to_date('03.01.2019', 'dd.mm.yyyy'));
insert into test values(2, to_date('02.01.2019', 'dd.mm.yyyy'), to_date('05.01.2019', 'dd.mm.yyyy'));
insert into test values(3, to_date('04.01.2019', 'dd.mm.yyyy'), to_date('06.01.2019', 'dd.mm.yyyy'));
语句才能获得如下信息:
SELECT
答案 0 :(得分:2)
另一种尝试使用cte递归的方法
WITH CTE(id,start_date,end_date) AS
(
SELECT id,start_date ,end_date
FROM test
UNION ALL
SELECT id,start_date ,cast((end_date - 1) as date)
FROM CTE
WHERE start_date <= cast((end_date - 1) as date)
)
SELECT end_date,COUNT(*)
FROM CTE
GROUP BY end_date
ORDER BY end_date
或使用CONNECT BY
SELECT dt,count(*)
FROM (
SELECT DISTINCT end_date,start_date + LEVEL dt
FROM test
CONNECT BY extract(day from end_date - start_date) - LEVEL + 1 >= 0
) t1
GROUP BY dt
ORDER BY dt
答案 1 :(得分:1)
解决此问题的关键是生成一个日期列表,您要为其计算不同ID的数量。然后,您可以简单地将JOIN
与列表一起使用此表,然后启用聚合。
这是一个简单的解决方案,它可以根据原始表的两个包含日期的列中的可用值来构建日期列表。使用递归子查询或日历表还可以使用其他(更好)的选项。
SELECT dt.mydate, COUNT(DISTINCT id_number) cnt
FROM
(
SELECT DISTINCT start_date mydate FROM test
UNION ALL SELECT DISTINCT end_date FROM test
) dt
LEFT JOIN test t ON dt.mydate >= t.start_date AND dt.mydate <= t.end_date
GROUP BY dt.mydate
ORDER BY dt.mydate
此 demo on DB Fiddle 及其示例数据将返回:
MYDATE | CNT :--------------------------- | --: 01-JAN-19 12.00.00.000000 AM | 1 02-JAN-19 12.00.00.000000 AM | 2 03-JAN-19 12.00.00.000000 AM | 2 04-JAN-19 12.00.00.000000 AM | 2 05-JAN-19 12.00.00.000000 AM | 2 06-JAN-19 12.00.00.000000 AM | 1
答案 2 :(得分:0)
SELECT start_date,COUNT(Id_number) from test group by start_date
通过这种方式,您可以按日期(开始日期或结束日期,任意选择)对行进行分组,并对具有相同日期的行进行计数。
我希望它能对您有所帮助。