【问题标题】:Merging Sql Rows based on same datetime基于相同日期时间合并 Sql 行
【发布时间】:2015-10-12 05:02:20
【问题描述】:

我正在努力完成以下任务。我有一张这样的桌子:

+-----+-------------------------+-------------------------+-------------------------+-------------------+-------------------+-------------------+
| Id  |      Assigned Date      |   Assigned Starttime    |    Assigned Endtime     | lesson_subject_id | lesson_teacher_id | lesson_classes_id |
+-----+-------------------------+-------------------------+-------------------------+-------------------+-------------------+-------------------+
| 116 | 2016-03-03 00:00:00.000 | 1900-01-01 13:15:00.000 | 1900-01-01 14:00:00.000 | SU_SK             | Adlberger         | CL_HEB 15/I B     |
| 112 | 2016-03-03 00:00:00.000 | 1900-01-01 13:15:00.000 | 1900-01-01 14:00:00.000 | SU_SK             | Jakob             | CL_HEB 15/I A     |
| 113 | 2016-03-03 00:00:00.000 | 1900-01-01 14:15:00.000 | 1900-01-01 15:00:00.000 | SU_SK             | Jakob             | CL_HEB 15/I A     |
| 117 | 2016-03-03 00:00:00.000 | 1900-01-01 14:15:00.000 | 1900-01-01 15:00:00.000 | SU_SK             | Adlberger         | CL_HEB 15/I B     |
| 118 | 2016-03-03 00:00:00.000 | 1900-01-01 15:15:00.000 | 1900-01-01 16:00:00.000 | SU_SK             | Adlberger         | CL_HEB 15/I B     |
| 114 | 2016-03-03 00:00:00.000 | 1900-01-01 15:15:00.000 | 1900-01-01 16:00:00.000 | SU_SK             | Jakob             | CL_HEB 15/I A     |
| 115 | 2016-03-03 00:00:00.000 | 1900-01-01 16:15:00.000 | 1900-01-01 17:00:00.000 | SU_SK             | Jakob             | CL_HEB 15/I A     |
| 119 | 2016-03-03 00:00:00.000 | 1900-01-01 16:15:00.000 | 1900-01-01 17:00:00.000 | SU_SK             | Adlberger         | CL_HEB 15/I B     |
+-----+-------------------------+-------------------------+-------------------------+-------------------+-------------------+-------------------+

如您所见,有些条目同时开始和结束。

我需要做的是合并单元格并删除不需要的行。

结果应该是这样的

+-----+-------------------------+-------------------------+-------------------------+-------------------+-------------------+----------------------------------+
| Id  |      Assigned Date      |   Assigned Starttime    |    Assigned Endtime     | lesson_subject_id | lesson_teacher_id |         lesson_classes_id        |
+-----+-------------------------+-------------------------+-------------------------+-------------------+-------------------+----------------------------------+
| 116 | 2016-03-03 00:00:00.000 | 1900-01-01 13:15:00.000 | 1900-01-01 14:00:00.000 | SU_SK             | Adlberger, Jakob  | CL_HEB 15/I A, CL_HEB 15/I B     |
| 113 | 2016-03-03 00:00:00.000 | 1900-01-01 14:15:00.000 | 1900-01-01 15:00:00.000 | SU_SK             | Adlberger, Jakob  | CL_HEB 15/I A, CL_HEB 15/I B     |
| 118 | 2016-03-03 00:00:00.000 | 1900-01-01 15:15:00.000 | 1900-01-01 16:00:00.000 | SU_SK             | Adlberger, Jakob  | CL_HEB 15/I A, CL_HEB 15/I B     |
| 115 | 2016-03-03 00:00:00.000 | 1900-01-01 16:15:00.000 | 1900-01-01 17:00:00.000 | SU_SK             | Adlberger, Jakob  | CL_HEB 15/I A, CL_HEB 15/I B     |
+-----+-------------------------+-------------------------+-------------------------+-------------------+-------------------+----------------------------------+

有什么想法可以实现吗?我在 Sql Server 2008 R2 上

问候卢卡斯

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题。

标签: sql merge sql-server-2008-r2 sql-merge


【解决方案1】:

如果您尝试按照建议的方式更新表,则无需进入解决方案:这似乎是糟糕的数据库(重新)设计,imo。

您为什么要这样做是第一个问题?

您可以在 UI 上对数据进行分组(需要进行一些开发)或通过拆分 course_subjects 和 course_classes/teachers 表并建立它们之间的关系来更改设计。 抱歉,这可能不是您需要的答案:)

编辑:我看到其他人确实有类似的问题,所以我很想找到答案。 在 oracle 中执行此操作的一种方法(建立在 Kibadachi 的答案之上):

SELECT  MIN(ID),
        ASSIGNED_DATE , 
        ASSIGNED_STARTTIME,
        ASSIGNED_STARTTIME, 
        LESSON_SUBJECT_ID,
        LISTAGG(TRIM(LESSON_TEACH_ID) , ',') WITHIN GROUP (ORDER BY LESSON_TEACH_ID ) AS LESSON_TEACH_ID,
        LISTAGG(TRIM(LESSON_CLASS_ID) , ',') WITHIN GROUP (ORDER BY LESSON_CLASS_ID ) AS LESSON_CLASS_ID 
FROM ATABLE
GROUP BY ASSIGNED_DATE, 
        ASSIGNED_STARTTIME,
        ASSIGNED_STARTTIME, 
        LESSON_SUBJECT_ID;

【讨论】:

  • 不幸的是,我使用的是 SQL 2008 R2,有类似的解决方案吗?
  • 我知道这是一个糟糕的设计......但我需要提到这个表是由从 XML 读取数据的数据导入生成的。导入服务只能以平面格式导入数据。因此,我需要清理所有数据,顺便说一句。这是在内存中的临时表中完成的。清理完数据后,我开始将记录导入正确的表中,然后应用程序可以访问这些表。
【解决方案2】:

您希望将 course_teacher_id 列连接起来: 计划A:

SELECT  assignedDate , 
        assignedStarttime , 
        assignedEndtime , 
        lesson_subject_id , 
        lesson_classes_id , 
        LISTAGG(lesson_teacher_id , ',')WITHIN GROUP (ORDER BY lesson_teacher_id ) AS lesson_teacher_id 
FROM myTable 
GROUP BY assignedDate,
         assignedStarttime ,
         assignedEndtime ;

B计划:

SELECT  assignedDate , 
            assignedStarttime , 
            assignedEndtime , 
            lesson_subject_id , 
            lesson_classes_id , 
            wm_concat(lesson_teacher_id , ',')WITHIN GROUP (ORDER BY lesson_teacher_id ) AS lesson_teacher_id 
    FROM myTable 
    GROUP BY assignedDate,
             assignedStarttime ,
             assignedEndtime ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多