【问题标题】:Select from results of query?从查询结果中选择?
【发布时间】:2012-01-03 00:00:06
【问题描述】:

我有一个这样的查询:

SELECT Weighings.Member, MIN(Sessions.DateTime) AS FirstDate, MAX(Sessions.DateTime) AS LastDate
FROM Weighings AS Weighings INNER JOIN
     Sessions ON Sessions.SessionGUID = Weighings.Session
WHERE     (Sessions.DateTime >= '01/01/2011')
GROUP BY Weighings.Member
ORDER BY Weighings.Member

它返回这个:

Member | FirstDate | LastDate
Blah   | 01/01/11  | 06/07/11
Blah2  | 02/03/11  | 05/07/11

我需要在表Weighings 中为返回值FirstDate 和LastDate 获取单元格Weight_kg 的值,以给出如下结果:

Member | FirstWeight | LastWeight
Blah   | 150Kg       | 60KG
Blah2  | 70Kg        | 72KG

我已经尝试了所有的组合,但无法解决,有什么想法吗?

编辑

表格:

Sessions
______________________
SessionGUID | DateTime
----------------------
12432524325 | 01/01/11
12432524324 | 01/08/11
12432524323 | 01/15/11
34257473563 | 03/05/11
43634574545 | 06/07/11

Weighings
_____________________________________
Member      | Session     | Weight_kg
-------------------------------------
vffd8fdg87f | 12432524325 | 150
vffd8fdg87f | 12432524324 | 120
vffd8fdg87f | 12432524323 | 110
ddffv89sdv8 | 34257473563 | 124
32878vfdsv8 | 43634574545 | 75

【问题讨论】:

  • 您可以添加带有一些示例行的表架构吗?

标签: sql database sql-server-2005 tsql


【解决方案1】:
;with C as
(
  select W.Member,
         W.Weight_kg,
         row_number() over(partition by W.Member order by S.datetime desc) as rnLast,
         row_number() over(partition by W.Member order by S.datetime asc) as rnFirst
  from Weighings as W
    inner join Sessions as S
      on S.sessionguid = W.Session and
         S.DateTime >= '20110101'
)
select CF.Member,
       CF.Weight_kg as FirstWeight,
       CL.Weight_kg as LastWeigth
from C as CF
  inner join C as CL
    on CF.Member = CL.Member
where CF.rnFirst = 1 and
      CL.rnLast = 1

在这里试试:https://data.stackexchange.com/stackoverflow/q/118518/

【讨论】:

    【解决方案2】:

    您可以使用 RANK..OVER stmt(仅适用于 SQL 2k5+)

    select fw.Member, st.Weight, en.Weight
    from
    (
        select Member, Weight, RANK() OVER(PARTITION BY Member ORDER BY Weight) rnk
        from Weighings
    ) st
    inner join 
    (
        select Member, Weight, RANK() OVER(PARTITION BY Member ORDER BY WeightDESC) rnk
        from Weighings
    ) en on en.Member= st.Member and st.rnk = 1 and en.rnk = 1
    

    【讨论】:

      【解决方案3】:

      你有两种可能。

      如果您想多次重复使用第一个 SELECT,我建议创建临时表

      CREATE TEMPORARY TABLE `tmpTable` AS SELECT /*the first select*/ ;
      
      /*and then*/
      
      SELECT * FROM `tmpTable` /*the second select from the first select*/
      

      如果您只需要第一次选择一次

      SELECT first.* 
      FROM (SELECT /*the first select*/) AS first
      

      【讨论】:

      • 您没有在此处创建Temporary 表。
      猜你喜欢
      • 2012-11-30
      • 1970-01-01
      • 2010-10-18
      • 2011-11-10
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      相关资源
      最近更新 更多