查询最近频繁使用Linq to Sql的用户的帮助

查询最近频繁使用Linq to Sql的用户的帮助,sql,Sql,我如何选择所有就诊的患者、他们第一次就诊的日期以及他们第一次就诊时的心率 病人只有一个病人吗?没有名字之类的吗?这就是你想要的吗? 当然,这里并不需要连接,因为Patient中没有额外的字段。但我想是有的 SELECT TOP(1) PatientID, VisitDate, HeartRate FROM Visit ORDER BY VisitDate ASC 编辑:替代版本。同样的事情。不太明显,因此不太可取 SELECT p.PatientID, v.VisitID, v.H

我如何选择所有就诊的患者、他们第一次就诊的日期以及他们第一次就诊时的心率

病人只有一个病人吗?没有名字之类的吗?

这就是你想要的吗? 当然,这里并不需要连接,因为Patient中没有额外的字段。但我想是有的

SELECT TOP(1) PatientID, VisitDate, HeartRate FROM Visit ORDER BY VisitDate ASC
编辑:替代版本。同样的事情。不太明显,因此不太可取

SELECT
  p.PatientID,
  v.VisitID,
  v.HeartRate,
  v.VisitDate
FROM
  Patient p
  INNER JOIN Visit v ON p.PatientID = v.PatientID
WHERE
  v.VisitDate = (
    SELECT MIN(VisitDate) 
    FROM Visit 
    WHERE PatientId = p.PatientId
  )
最后一个问题

SELECT
  p.PatientID,
  v.VisitID,
  v.HeartRate,
  v.VisitDate
FROM
  Patient p
  INNER JOIN Visit v ON p.PatientID = v.PatientID
  INNER JOIN (
    SELECT PatientID, MIN(VisitDate) VisitDate 
    FROM Visit 
    GROUP BY PatientID
  ) f ON f.PatientID = p.PatientID AND f.VisitDate = v.VisitDate

我猜患者和就诊之间存在一对多的关系?我只发布了患者的相关专栏。不管怎样,我需要第一次探视:那么应该是这样的。他不想让所有的病人都去探视吗?对不起,第一次探视失败了。这将是一个内部连接;p查询是相同的,但添加了一个“SORT BY VisitDate DESC GROUP BY PatientId”。hrmm这与我的查询很接近,但我希望有更好的方法。谢谢,所以我认为没有更好的方法了。不管你怎么定义。如果您的意思是不使用子查询。。。您可以根据PatientID从就诊组中选择PatientID、MINVisitDate添加内部联接。但这只是伪装的子查询。更多,以便您加入patientID/就诊日期组合。但我认为这是唯一的方法是的,您可以将我版本1查询的WHERE条件移动到join条件,只需将WHERE替换为AND即可。如果它能让你快乐的话SQL Server将生成相同的查询计划。
SELECT
  p.PatientID,
  v.VisitID,
  v.HeartRate,
  v.VisitDate
FROM
  Patient p
  INNER JOIN Visit v ON p.PatientID = v.PatientID
WHERE
  v.VisitDate = (
    SELECT MIN(VisitDate) 
    FROM Visit 
    WHERE PatientId = p.PatientId
  )
SELECT
  p.PatientID,
  v.VisitID,
  v.HeartRate,
  v.VisitDate
FROM
  Patient p
  INNER JOIN Visit v ON p.PatientID = v.PatientID
  INNER JOIN (
    SELECT PatientID, MIN(VisitDate) VisitDate 
    FROM Visit 
    GROUP BY PatientID
  ) f ON f.PatientID = p.PatientID AND f.VisitDate = v.VisitDate
declare @practiceID int 
select 
    isnull(sum(isResponder),0) as [Responders],
    isnull(count(*) - sum(isResponder),0) as [NonResponders]
from (  
    select 
        v.patientID
        ,firstVisit.hbLevel as startHb
        ,maxHbVisit.hblevel as maxHb
        , case when (maxHbVisit.hblevel - firstVisit.hbLevel >= 1) then 1 else 0 end as isResponder
    from patient p 
        inner join visit v on v.patientid = v.patientid 
        inner join practice on practice.practiceid = p.practiceid
        inner join (
            SELECT
              p.PatientID
              ,v.VisitID
              ,v.hblevel 
              ,v.VisitDate 
            FROM Patient p
              INNER JOIN Visit v ON p.PatientID = v.PatientID
            WHERE
                v.VisitDate = (
                    SELECT MIN(VisitDate) 
                    FROM Visit 
                    WHERE PatientId = p.PatientId
                 )
        ) firstVisit on firstVisit.patientID = v.patientID
        inner join (
            select 
                p.patientID
                ,max(v.hbLevel) as hblevel
            from Patient p
                 INNER JOIN Visit v ON p.PatientID = v.PatientID
            group by
                p.patientID
        ) MaxHbVisit on maxHbVisit.patientid = v.patientId
    where
        p.practiceID = isnull(@practiceID, p.practiceID)
    group by
        v.patientID
        ,firstVisit.hbLevel
        ,maxHbVisit.hblevel
    having
        datediff(
            d,
            dateadd(
                day
                ,-DatePart(
                    dw
                    ,min(v.visitDate)
                ) + 1
                ,min(v.visitDate)
            )
            , max(v.visitDate)
        ) >= (7 * 8)
) responders