有没有其他方法可以在不使用临时表的情况下编写这些查询?

时间:2020-01-02 15:54:22

标签: sql sql-server sql-server-2008

我有3个表(tb_cdcp_ATQchild,tb_cdcp_ATQInfant,tb_cdcp_ATQPreschool),看起来与下面的第一个表相似。根据IndividualID和createdate,我需要计算第二个数字低于第一个数字的所有IndividualID。例如,对于IndividualID = 7029AF536A9EB4B1697D,如果您将C_Q1到C_Q5进行计数,则1/18/19的总数为9,如果您将C_Q1到C_Q5进行计数,则1/19/19的总数为5,因此,IndividualID的计数为1,因为第二个数字比第一个数字小。我有3个看起来像具有相同逻辑的表。第四张表-tb_cdcp_ANSchecklist-下面的第二张表-具有True和False,并且需要与其他3个表包括在一起,但逻辑略有不同。因此,对于tb_cdcp_ANSchecklist表中的7029AF536A9EB4B1697D,11/22/19的计数为6,而12/3/19的计数为6-如果第二个条目中的错误数目更多,则第一个条目的个人ID则计为1,但是,即使individualid有多个表,其中第二个数字低于第一个数字,IndividualID的计数也仅为1。这很令人困惑,我希望这样做是有道理的。

tb_cdcp_ATQchild

tb_cdcp_ANSChecklist

---Child Tables
IF OBJECT_ID('tempdb.dbo.#temp1', 'U') IS NOT NULL
  DROP TABLE #temp1; 
select *,Row_number() Over(Partition by ATQChild_IndividualID Order by ATQChild_CreateDate) as rownum
into #temp1
from [dbo].[vCDCP_rptChildImprove]

IF OBJECT_ID('tempdb.dbo.#temp2', 'U') IS NOT NULL
  DROP TABLE #temp2; 
select a.ATQChild_IndividualID,a.ATQChild_CreateDate,a.ChildSum,b.ChildSum as B_Childsum,case when a.ChildSum<b.ChildSum then 1 else 0 end as flag
into #temp2
from #temp1 a left join #temp1 b on a.ATQChild_IndividualID=b.ATQChild_IndividualID and a.rownum=b.rownum+1

IF OBJECT_ID('tempdb.dbo.#temp3', 'U') IS NOT NULL
  DROP TABLE #temp3; 
select *,row_number() over(Partition by ATQChild_IndividualID,flag order by ATQChild_CreateDate) as rownum1
into #temp3
from #temp2

UPDATE #temp3
SET flag=0
where flag=1 and rownum1>1

---Infant Tables
IF OBJECT_ID('tempdb.dbo.#temp4', 'U') IS NOT NULL
  DROP TABLE #temp4; 
select *,Row_number() Over(Partition by ATQInfant_IndividualID Order by ATQInfant_CreateDate) as rownum
into #temp4
from [dbo].[vCDCP_rptInfantImprove]

IF OBJECT_ID('tempdb.dbo.#temp5', 'U') IS NOT NULL
  DROP TABLE #temp5; 
select a.ATQInfant_IndividualID,a.ATQInfant_CreateDate,a.InfantSum,b.InfantSum as B_Infantsum,case when a.InfantSum<b.InfantSum then 1 else 0 end as flag
into #temp5
from #temp4 a left join #temp4 b on a.ATQInfant_IndividualID=b.ATQInfant_IndividualID and a.rownum=b.rownum+1

IF OBJECT_ID('tempdb.dbo.#temp6', 'U') IS NOT NULL
  DROP TABLE #temp6; 
select *,row_number() over(Partition by ATQInfant_IndividualID,flag order by ATQInfant_CreateDate) as rownum1
into #temp6
from #temp5

UPDATE #temp6
SET flag=0
where flag=1 and rownum1>1

---Preschool Tables
IF OBJECT_ID('tempdb.dbo.#temp7', 'U') IS NOT NULL
  DROP TABLE #temp7; 
select *,Row_number() Over(Partition by ATQPreschool_IndividualID Order by ATQPreschool_CreateDate) as rownum
into #temp7
from [dbo].[vCDCP_rptPreschoolImprove]

IF OBJECT_ID('tempdb.dbo.#temp8', 'U') IS NOT NULL
  DROP TABLE #temp8; 
select a.ATQPreschool_IndividualID,a.ATQPreschool_CreateDate,a.PreschoolSum,b.PreschoolSum as B_Preschoolsum,case when a.PreschoolSum<b.PreschoolSum then 1 else 0 end as flag
into #temp8
from #temp7 a left join #temp7 b on a.ATQPreschool_IndividualID=b.ATQPreschool_IndividualID and a.rownum=b.rownum+1

IF OBJECT_ID('tempdb.dbo.#temp9', 'U') IS NOT NULL
  DROP TABLE #temp9; 
select *,row_number() over(Partition by ATQPreschool_IndividualID,flag order by ATQPreschool_CreateDate) as rownum1
into #temp9
from #temp8

UPDATE #temp9
SET flag=0
where flag=1 and rownum1>1

---ANS Tables
IF OBJECT_ID('tempdb.dbo.#temp10', 'U') IS NOT NULL
  DROP TABLE #temp10; 
select *,Row_number() Over(Partition by ANS_IndividualID Order by ANS_CreateDate) as rownum
into #temp10
from [dbo].[vCDCP_rptANSImprove]

IF OBJECT_ID('tempdb.dbo.#temp11', 'U') IS NOT NULL
  DROP TABLE #temp11; 
select a.ANS_IndividualID,a.ANS_CreateDate,a.ANS_DepSum as A_DepSum,b.ANS_DepSum as B_DepSum,a.ANS_ArrSum as A_ArrSum, b.ANS_ArrSum as B_ArrSum,
case when a.ANS_DepSum<b.ANS_DepSum then 1 when a.ANS_ArrSum<b.ANS_ArrSum then 1 else 0 end as flag
into #temp11
from #temp10 a left join #temp10 b on a.ANS_IndividualID=b.ANS_IndividualID and a.rownum=b.rownum+1

IF OBJECT_ID('tempdb.dbo.#temp12', 'U') IS NOT NULL
  DROP TABLE #temp12; 
select *,row_number() over(Partition by ANS_IndividualID,flag order by ANS_CreateDate) as rownum1
into #temp12
from #temp11

UPDATE #temp12
SET flag=0
where flag=1 and rownum1>1

2 个答案:

答案 0 :(得分:0)

您实际上并没有提供任何示例文本,因此我认为人们不希望理解您的代码并对其进行测试。您可以从以下开始:

SELECT *, 
  CASE WHEN c_q1+c_q2+c_q3+c_q4+c_q5 >
       LEAD(c_q1+c_q2+c_q3+c_q4+c_q5) 
          OVER (PARTITION BY IndividuaID ORDER BY Child_CreateDate)
       THEN 1 ELSE 0 END AS compareVal
FROM tb_cdcp_ATQchild;

我不明白您要如何处理其余的桌子。

编辑:并且您可以使用CTE代替临时表,这可能使它更容易。

答案 1 :(得分:0)

我上次检查时,SQL Server中的布尔值只是绑定到[0,1]的整数。我还假设没有null。希望这行得通。

SELECT IndividualID, IIF(sum(flag) != 0, 1, 0) as flag
FROM (
         SELECT IndivisualID,
                IIF(C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5 >
                    LEAD(C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5) OVER (PARTITION BY IndividualID ORDER BY Child_CreateDate),
                    true, false) AS flag
         FROM tb_cdcp_ATQchild
         UNION ALL
         SELECT IndivisualID,
                IIF(C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5 >
                    LEAD(C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5) OVER (PARTITION BY IndividualID ORDER BY Child_CreateDate),
                    true, false) AS flag
         FROM tb_cdcp_ATQInfant
         UNION ALL
         SELECT IndivisualID,
                IIF(C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5 >
                    LEAD(C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5) OVER (PARTITION BY IndividualID ORDER BY Child_CreateDate),
                    true, false) AS flag
         FROM tb_cdcp_ATQPreschool
         UNION ALL
         SELECT IndivisualID,
                IIF(anxiety_arr + anxiety_dep + hyper_arr + exagg_arr + exagg_dep >
                    LEAD(anxiety_arr + anxiety_dep + hyper_arr + exagg_arr + exagg_dep)
                         OVER (PARTITION BY IndividualID ORDER BY CreateDate), true,
                    false) AS flag
         FROM tb_cdcp_ANSchecklist
     ) AS entries
GROUP BY IndividualID

没有LEAD的版本。

WITH child (IndividualID, flag, row_num) AS (
         SELECT IndividualID,
                C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5                                        AS flag,
                ROW_NUMBER() over (PARTITION BY IndividualID ORDER BY Child_CreateDate) AS row_num
         FROM tb_cdcp_ATQchild),
     infant (IndividualID, flag, row_num) AS (
         SELECT IndividualID,
                C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5                                        AS flag,
                ROW_NUMBER() over (PARTITION BY IndividualID ORDER BY Child_CreateDate) AS row_num
         FROM tb_cdcp_ATQInfant),
     preschool (IndividualID, flag, row_num) AS (
         SELECT IndividualID,
                C_Q1 + C_Q2 + C_Q3 + C_Q4 + C_Q5                                        AS flag,
                ROW_NUMBER() over (PARTITION BY IndividualID ORDER BY Child_CreateDate) AS row_num
         FROM tb_cdcp_ATQPreschool),
     checklist (IndividualID, flag, row_num) AS (
         SELECT IndividualID,
                anxiety_arr + anxiety_dep + hyper_arr + exagg_arr + exagg_dep     AS flag,
                ROW_NUMBER() over (PARTITION BY IndividualID ORDER BY CreateDate) AS row_num
         FROM tb_cdcp_ANSchecklist)
SELECT *
FROM (
         SELECT IndividualID,
                CAST(sum(IIF(row_num = 1, flag, -flag)) > 0 as BIT) over (PARTITION BY IndividualID) as flag, 'child' as table_name
         FROM child
         WHERE row_num <= 2
         UNION ALL
         SELECT IndividualID,
                CAST(sum(IIF(row_num = 1, flag, -flag)) > 0 as BIT) over (PARTITION BY IndividualID) as flag, 'infant' as table_name
         FROM infant
         WHERE row_num <= 2
         UNION ALL
         SELECT IndividualID,
                CAST(sum(IIF(row_num = 1, flag, -flag)) > 0 as BIT) over (PARTITION BY IndividualID) as flag, 'preschool' as table_name
         FROM preschool
         WHERE row_num <= 2
         UNION ALL
         SELECT IndividualID,
                CAST(sum(IIF(row_num = 1, flag, -flag)) > 0 as BIT) over (PARTITION BY IndividualID) as flag, 'checklist' as table_name
         FROM checklist
         WHERE row_num <= 2) AS entries
相关问题