【问题标题】:Select Columns other then Columns included in group by clause on condition basis根据条件选择包含在 group by 子句中的列以外的列
【发布时间】:2019-07-01 09:46:52
【问题描述】:

我需要在fkIdDateFrom的基础上按记录分组,但还需要选择TimeFrom第一条记录和TimeTo从第二条记录

pkID |  fkID  | DateFrom          | TimeFrom  | TimeTo
104  |  20    | 05-02-2019 00:00  | 12:00     | 23:59
105  |  20    | 06-02-2019 00:00  | 00:00     | 12:00
106  |  20    | 06-02-2019 00:00  | 12:00     | 23:59
107  |  20    | 07-02-2019 00:00  | 00:00     | 12:00

General GROUP BY 不允许 TimeFrom 和 TimeTo 包含在选择查询中。

数据就是这样,日期为 1 行或 2 行,1 行表示仅上午或下午,2 行表示上午和下午。

SELECT fkID, DateFrom --, TimeFrom
FROM table 
GROUP BY fkID, DateFrom

所以想要的输出是这样的:

fkID |  DateFrom         | TimeFrom |  TimeTo
20   |  05-02-2019 00:00 |  12:00   |   23:59
20   |  06-02-2019 00:00 |  00:00   |   23:59
20   |  07-02-2019 00:00 |  00:00   |   12:00

所以对于 Date 06-02-2019 00:00,将 dateFrom 和 DateTo 组合在一行中。

【问题讨论】:

  • 分享你的尝试代码
  • 间隔中不会有间隙或重叠吗?如果是,会发生什么?
  • 不,不会,数据就是这样,1行或2行日期,1行表示只有上午/下午,2行表示上午和下午。

标签: sql tsql group-by


【解决方案1】:

如果同一组对应的区间没有间隙和重叠,那么您可以简单地使用GROUP BY。我假设TimeFromTimeToTime 数据类型。

select fkID, dateFrom,
       min(TimeFrom),
       max(TimeTo)
from your_table
group by fkID, dateFrom

【讨论】:

  • 完美运行。
【解决方案2】:

通过放置group by 子句,您可以将max 放在TimeTo 中,例如

select fkID ,DateFrom ,TimeFrom ,max(TimeTo) 
from <tablename> 
group by fkID ,DateFrom

它会给你想要的输出。

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多