【问题标题】:GROUP BY With ORDER BY ASC & DESCGROUP BY 与 ORDER BY ASC 和 DESC
【发布时间】:2020-03-09 19:41:29
【问题描述】:

我有一张表spa,其中包含我需要的大部分信息:

我加入另一个表 client,以获取 last_name 字段:

我需要为每个sba_dateprovider_code 获取第一个room_codeservice_detailprovider_start_time,以及最后一个 provider_end_time

以我的图片为例,预期的结果是:

【问题讨论】:

  • room_codeservice_detail 中的“第一”是什么意思?那些对应于最小的provider_start_time?
  • 以及如何匹配clientspa?我找不到外键..
  • @Islingre 应该按provider_start_time 订购,所以violet/deep90 28 号,moon/botwater 30 号,amehty/swed60 31 日。这些表由provider_codeclient_code 连接。对不起,我忘了包括这个!

标签: sql sql-server group-by sql-order-by


【解决方案1】:

您也可以使用一些 CTE 或子查询:

;WITH cte AS ( --getting min and max time for particular provider on some date
SELECT sba_date,
       MIN(provider_start_time) as provider_start_time,
       MAX(provider_end_time) as provider_end_time,
       provider_code
FROM spa
GROUP BY sba_date, provider_code
)
-- here goes join to clients (last_name) and original table to get room and detail
SELECT s.room_code,
       s.service_detail,
       c.sba_date,
       c.provider_start_time,
       c.provider_end_time,
       cl.last_name
FROM cte c
INNER JOIN client cl
   ON c.provider_code = cl.client_code
INNER JOIN spa s
   ON s.sba_date = c.sba_date0
    AND s.provider_code = c.provider_code
    AND s.provider_start_time = c.provider_start_time

【讨论】:

    【解决方案2】:

    我认为这可以通过窗口函数row_number()last_value() 来完成:

    select
        room_code,
        service_detail,
        sba_date,
        provider_start_time,
        provider_end_time,
        last_name
    from (
        select 
            s.*,
            c.last_name,
            row_number() over(
                partition by s.sba_date, s.provider_code
                order by s.provider_start_time
            ) rn,
            last_value(provider_end_time) over(
                partition by s.sba_date, s.provider_code
                order by s.provider_start_time
                range between unbounded preceding and unbounded following
            ) provider_end_time
        from spa s
        inner join client c on c.client_code = s.provider_code
    ) t
    where rn = 1
    

    内部查询连接两个表,并对具有相同sba_dateprovider_code的记录组中的记录进行升序provider_start_time;它还计算同一组内provider_end_time 的最后一个值。然后,外部查询过滤每个组中的第一条记录。

    【讨论】:

    • t 上出现错误:The column 'last_name' was specified multiple times for 't'.
    • @WolfieeifloW:在我的查询中,last_name 在子查询中只出现一次,在外部查询中出现一次,这很好。表spa 中有一个名为last_name 的列吗?
    • spa表中有一个名为last_name的列​​,是的。
    • 嗯,这就是产生错误的原因。子查询中不能有两个同名的列。此列未显示在您的示例数据中,所以我无法确定。要解决此错误,您只需将子查询中的s.* 替换为您要选择的列列表(如s.room_code, s.service_detail, ...
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 2013-09-20
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多