按id分组 时间排序,取每个组里的第一次时间和最后一次时间差,并用case when then匹配状态
时间: 2024-12-10 22:33:34 浏览: 9
在SQL查询中,如果你想要按ID对数据分组,然后计算每组内的首次记录时间和最后记录时间之间的差异,并根据某种状态进行分类,你可以使用以下结构:
```sql
WITH grouped_data AS (
SELECT
id,
MIN(time) as first_time,
MAX(time) as last_time,
CASE
WHEN status = '状态1' THEN '分类1'
WHEN status = '状态2' THEN '分类2'
ELSE '其他分类' -- 或者根据实际状态添加其他条件
END as status_category
FROM your_table
GROUP BY id
)
SELECT * FROM grouped_data;
```
在这个查询中:
- `grouped_data` CTE (Common Table Expression) 子查询首先按ID分组并分别找出每个组的最早(`MIN(time)`)和最晚(`MAX(time)`)时间。
- `CASE WHEN THEN` 语句用于根据status字段的不同值,将结果分成不同的类别。
- 最后的`SELECT * FROM grouped_data` 会返回所有处理过的分组信息。
相关问题
ROUND((case when temp.本地网处理时间 is null then 0 when temp.本地网处理时间 is not null and temp.发起人确认时间 is null then sysdate - temp.本地网处理时间 when temp.本地网处理时间 is not null and temp.发起人确认时间 is not null and temp.发起人确认时间 - temp.本地网处理时间 < 0 then 0 when temp.本地网处理时间 is not null and temp.发起人确认时间 is not null and temp.发起人确认时间 - temp.本地网处理时间 is null then 0 else temp.发起人确认时间 - temp.本地网处理时间 end) * 24 ,2)S详细讲解一下每一句
这是一个SQL查询中的一段代码,用于计算一个时间差,并将结果四舍五入为两位小数。下面是对每一句代码的详细解释:
1. `ROUND(`: 这是一个函数,用于对数值进行四舍五入。
2. `case`: 这是一个条件语句,用于根据不同的条件执行不同的逻辑。
3. `when temp.本地网处理时间 is null then 0`: 如果`temp.本地网处理时间`为空,将结果设置为0。
4. `when temp.本地网处理时间 is not null and temp.发起人确认时间 is null then sysdate - temp.本地网处理时间`: 如果`temp.本地网处理时间`不为空,且`temp.发起人确认时间`为空,将结果设置为当前系统时间(`sysdate`)减去`temp.本地网处理时间`。
5. `when temp.本地网处理时间 is not null and temp.发起人确认时间 is not null and temp.发起人确认时间 - temp.本地网处理时间 < 0 then 0`: 如果`temp.本地网处理时间`和`temp.发起人确认时间`都不为空,且它们的差值小于0,将结果设置为0。
6. `when temp.本地网处理时间 is not null and temp.发起人确认时间 is not null and temp.发起人确认时间 - temp.本地网处理时间 is null then 0`: 如果`temp.本地网处理时间`和`temp.发起人确认时间`都不为空,且它们的差值为空,将结果设置为0。
7. `else temp.发起人确认时间 - temp.本地网处理时间`: 对于其他情况,即`temp.本地网处理时间`和`temp.发起人确认时间`都不为空且它们的差值大于等于0,将结果设置为`temp.发起人确认时间`减去`temp.本地网处理时间`。
8. `end) * 24 ,2)`: 结束条件语句,将结果乘以24,并将最终结果四舍五入为两位小数。
因此,这段代码的作用是计算`temp.本地网处理时间`和`temp.发起人确认时间`之间的时间差,并将结果四舍五入为两位小数。
SELECT b.city AS administrativeDivision, isnull(sum(case when a.enterprise_level=0 then 1 else 0 end),0) as excellent, isnull(sum(case when a.enterprise_level=1 then 1 else 0 end),0) as good, isnull(sum(case when a.enterprise_level=2 then 1 else 0 end),0) as average, isnull(sum(case when a.enterprise_level=3 then 1 else 0 end),0) as poor, COUNT(a.ID) AS enterprises_total FROM ALL_SAFE.t_enterprise_effect a,ALL_SAFE.T_ENTERPRISE_INFO b WHERE a.enterprise_code = b.enter_code and a.end_time >= TRUNC(NEXT_DAY(SYSDATE-8,1)-6) AND a.end_time < TRUNC(NEXT_DAY(SYSDATE-8,1)+1) AND (b.city != '') group by b.city
这是另一个SQL查询语句,用于统计企业级别在指定时间范围内的数量,并按城市进行分组。
查询结果包括行政区划(使用b.city字段作为别名)、优秀企业数量、良好企业数量、一般企业数量、差劣企业数量和总企业数量。
查询条件包括企业编码与企业信息表中的企业编码匹配,以及结束时间在指定范围内的条件。还有一个额外的条件是城市不为空。
最后,使用GROUP BY语句按城市进行分组,以获取每个城市的统计结果。
请注意,这个查询语句也使用了动态SQL的写法,并使用了SUM和CASE语句来计算不同企业级别的数量。
阅读全文