我有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。这很令人困惑,我希望这样做是有道理的。
---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
答案 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