SSRS 2012:如何仅 return 最近的行?
SSRS 2012: How do I return the most recent rows only?
好的,这是我当前的查询:
SELECT pk.RxFill.PATIENT_PRICE
,PersonQuotas.QuotaYear
,PersonQuotas.QuotaMonth
(and a bunch of other stuff to link them)
FROM
pk.RxMain
INNER JOIN pk.Doctor
ON pk.RxMain.PHARMACY_ID = pk.Doctor.PHARMACY_ID AND pk.RxMain.DOCTOR_ID = pk.Doctor.DOCTOR_ID
INNER JOIN pk.Formula
ON pk.RxMain.PHARMACY_ID = pk.Formula.PHARMACY_ID AND pk.RxMain.FORMULA_ID = pk.Formula.FORMULA_ID
INNER JOIN pk.Patient
ON pk.RxMain.PHARMACY_ID = pk.Patient.PHARMACY_ID AND pk.RxMain.PATIENT_ID = pk.Patient.PATIENT_ID
INNER JOIN pk.RxFill
ON pk.RxMain.PHARMACY_ID = pk.RxFill.PHARMACY_ID AND pk.RxMain.RXMAIN_ID = pk.RxFill.RXMAIN_ID
INNER JOIN pk.Insurance
ON pk.RxFill.PHARMACY_ID = pk.Insurance.PHARMACY_ID AND pk.RxFill.INSURANCE_ID = pk.Insurance.INSURANCE_ID
INNER JOIN PersonsRepId
ON pk.Doctor.PHARMACY_ID = PersonsRepId.PharmacyId AND pk.Doctor.SALES_PERSON_ID = PersonsRepId.SalesRepId
INNER JOIN Persons
ON PersonsRepId.PersonId = Persons.PersonId
INNER JOIN PersonQuotas
ON Persons.PersonId = PersonQuotas.PersonId
WHERE
Year(pk.RxFill.FILL_DATE) >= Year(GetDate())
我只对最近的 QuotaYear/QuotaMonth 组合感兴趣,自从我们开始在 [=] 中跟踪它们以来,我们的记录数据库一直为每个 QuotaYear/QuotaMonth 组合返回 RXFILL 行24=](所以,我得到了 2014/4、2014/5、2014/6 等的一行)。
更复杂的是,我的 table 中可能不存在当前的 year/month 组合(例如,目前没有人输入本月的配额),所以我需要基本上能够识别最近的 year/month(均以整数形式输入)并仅提取那些行(以便我可以进行其他计算)。
我该怎么做 -- 编辑:这样我就不必知道最近一个月在 运行 时间是几号了?
我正在尝试这个,可能会有更优化的东西。但基本上,使用 CTE 来过滤 year/date,然后加入它。
with cte1 as (
select top 1 max(QuotaYear) as QuotaYear, QuotaMonth
from PersonQuotas
group by QuotaMonth
order by QuotaYear desc, QuotaMonth desc
)
SELECT pk.RxFill.PATIENT_PRICE
,PersonQuotas.QuotaYear
,PersonQuotas.QuotaMonth
--(and a bunch of other stuff to link them)
FROM
pk.RxMain
INNER JOIN pk.Doctor
ON pk.RxMain.PHARMACY_ID = pk.Doctor.PHARMACY_ID AND pk.RxMain.DOCTOR_ID = pk.Doctor.DOCTOR_ID
INNER JOIN pk.Formula
ON pk.RxMain.PHARMACY_ID = pk.Formula.PHARMACY_ID AND pk.RxMain.FORMULA_ID = pk.Formula.FORMULA_ID
INNER JOIN pk.Patient
ON pk.RxMain.PHARMACY_ID = pk.Patient.PHARMACY_ID AND pk.RxMain.PATIENT_ID = pk.Patient.PATIENT_ID
INNER JOIN pk.RxFill
ON pk.RxMain.PHARMACY_ID = pk.RxFill.PHARMACY_ID AND pk.RxMain.RXMAIN_ID = pk.RxFill.RXMAIN_ID
INNER JOIN pk.Insurance
ON pk.RxFill.PHARMACY_ID = pk.Insurance.PHARMACY_ID AND pk.RxFill.INSURANCE_ID = pk.Insurance.INSURANCE_ID
INNER JOIN PersonsRepId
ON pk.Doctor.PHARMACY_ID = PersonsRepId.PharmacyId AND pk.Doctor.SALES_PERSON_ID = PersonsRepId.SalesRepId
INNER JOIN Persons
ON PersonsRepId.PersonId = Persons.PersonId
INNER JOIN PersonQuotas
ON Persons.PersonId = PersonQuotas.PersonId
WHERE
--Year(pk.RxFill.FILL_DATE) >= Year(GetDate())
PersonQuotas.QuotaYear = cte1.QuotaYear
and PersonQuotas.QuotaMonth = cte1.quotaMonth
WITH Ordinal (PersonID, QuotaYear, QuotaMonth, TRxAmount, QRxAmount, Ord) AS
(
SELECT PersonQuotas.PersonID, PersonQuotas.QuotaYear, PersonQuotas.QuotaMonth, PersonQuotas.TRxAmount, PersonQuotas.QRxAmount,
ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY QuotaYear DESC, QuotaMonth DESC)
FROM PersonQuotas
)
SELECT
pk.RxMain.PHARMACY_ID AS [RxMain PHARMACY_ID]
[STUFF FROM OTHER DATA TABLES]
,Ordinal.PersonID AS [Ordinal PersonID]
,Ordinal.QuotaYear
,Ordinal.QuotaMonth
,Ordinal.TRxAmount
,Ordinal.QRxAmount
FROM
pk.RxMain
INNER JOIN pk.Doctor
ON pk.RxMain.PHARMACY_ID = pk.Doctor.PHARMACY_ID AND pk.RxMain.DOCTOR_ID = pk.Doctor.DOCTOR_ID
INNER JOIN pk.Formula
ON pk.RxMain.PHARMACY_ID = pk.Formula.PHARMACY_ID AND pk.RxMain.FORMULA_ID = pk.Formula.FORMULA_ID
INNER JOIN pk.Patient
ON pk.RxMain.PHARMACY_ID = pk.Patient.PHARMACY_ID AND pk.RxMain.PATIENT_ID = pk.Patient.PATIENT_ID
INNER JOIN pk.RxFill
ON pk.RxMain.PHARMACY_ID = pk.RxFill.PHARMACY_ID AND pk.RxMain.RXMAIN_ID = pk.RxFill.RXMAIN_ID
INNER JOIN pk.Insurance
ON pk.RxFill.PHARMACY_ID = pk.Insurance.PHARMACY_ID AND pk.RxFill.INSURANCE_ID = pk.Insurance.INSURANCE_ID
INNER JOIN PersonsRepId
ON pk.Doctor.PHARMACY_ID = PersonsRepId.PharmacyId AND pk.Doctor.SALES_PERSON_ID = PersonsRepId.SalesRepId
INNER JOIN Persons
ON PersonsRepId.PersonId = Persons.PersonId
INNER JOIN Ordinal
ON Persons.PersonId = Ordinal.PersonId
WHERE
( pk.RxFill.FILL_DATE >= dateadd(year, datediff(year, 0, getdate()), 0) AND
Ordinal.Ord = 1 )
好的,这是我当前的查询:
SELECT pk.RxFill.PATIENT_PRICE
,PersonQuotas.QuotaYear
,PersonQuotas.QuotaMonth
(and a bunch of other stuff to link them)
FROM
pk.RxMain
INNER JOIN pk.Doctor
ON pk.RxMain.PHARMACY_ID = pk.Doctor.PHARMACY_ID AND pk.RxMain.DOCTOR_ID = pk.Doctor.DOCTOR_ID
INNER JOIN pk.Formula
ON pk.RxMain.PHARMACY_ID = pk.Formula.PHARMACY_ID AND pk.RxMain.FORMULA_ID = pk.Formula.FORMULA_ID
INNER JOIN pk.Patient
ON pk.RxMain.PHARMACY_ID = pk.Patient.PHARMACY_ID AND pk.RxMain.PATIENT_ID = pk.Patient.PATIENT_ID
INNER JOIN pk.RxFill
ON pk.RxMain.PHARMACY_ID = pk.RxFill.PHARMACY_ID AND pk.RxMain.RXMAIN_ID = pk.RxFill.RXMAIN_ID
INNER JOIN pk.Insurance
ON pk.RxFill.PHARMACY_ID = pk.Insurance.PHARMACY_ID AND pk.RxFill.INSURANCE_ID = pk.Insurance.INSURANCE_ID
INNER JOIN PersonsRepId
ON pk.Doctor.PHARMACY_ID = PersonsRepId.PharmacyId AND pk.Doctor.SALES_PERSON_ID = PersonsRepId.SalesRepId
INNER JOIN Persons
ON PersonsRepId.PersonId = Persons.PersonId
INNER JOIN PersonQuotas
ON Persons.PersonId = PersonQuotas.PersonId
WHERE
Year(pk.RxFill.FILL_DATE) >= Year(GetDate())
我只对最近的 QuotaYear/QuotaMonth 组合感兴趣,自从我们开始在 [=] 中跟踪它们以来,我们的记录数据库一直为每个 QuotaYear/QuotaMonth 组合返回 RXFILL 行24=](所以,我得到了 2014/4、2014/5、2014/6 等的一行)。
更复杂的是,我的 table 中可能不存在当前的 year/month 组合(例如,目前没有人输入本月的配额),所以我需要基本上能够识别最近的 year/month(均以整数形式输入)并仅提取那些行(以便我可以进行其他计算)。
我该怎么做 -- 编辑:这样我就不必知道最近一个月在 运行 时间是几号了?
我正在尝试这个,可能会有更优化的东西。但基本上,使用 CTE 来过滤 year/date,然后加入它。
with cte1 as (
select top 1 max(QuotaYear) as QuotaYear, QuotaMonth
from PersonQuotas
group by QuotaMonth
order by QuotaYear desc, QuotaMonth desc
)
SELECT pk.RxFill.PATIENT_PRICE
,PersonQuotas.QuotaYear
,PersonQuotas.QuotaMonth
--(and a bunch of other stuff to link them)
FROM
pk.RxMain
INNER JOIN pk.Doctor
ON pk.RxMain.PHARMACY_ID = pk.Doctor.PHARMACY_ID AND pk.RxMain.DOCTOR_ID = pk.Doctor.DOCTOR_ID
INNER JOIN pk.Formula
ON pk.RxMain.PHARMACY_ID = pk.Formula.PHARMACY_ID AND pk.RxMain.FORMULA_ID = pk.Formula.FORMULA_ID
INNER JOIN pk.Patient
ON pk.RxMain.PHARMACY_ID = pk.Patient.PHARMACY_ID AND pk.RxMain.PATIENT_ID = pk.Patient.PATIENT_ID
INNER JOIN pk.RxFill
ON pk.RxMain.PHARMACY_ID = pk.RxFill.PHARMACY_ID AND pk.RxMain.RXMAIN_ID = pk.RxFill.RXMAIN_ID
INNER JOIN pk.Insurance
ON pk.RxFill.PHARMACY_ID = pk.Insurance.PHARMACY_ID AND pk.RxFill.INSURANCE_ID = pk.Insurance.INSURANCE_ID
INNER JOIN PersonsRepId
ON pk.Doctor.PHARMACY_ID = PersonsRepId.PharmacyId AND pk.Doctor.SALES_PERSON_ID = PersonsRepId.SalesRepId
INNER JOIN Persons
ON PersonsRepId.PersonId = Persons.PersonId
INNER JOIN PersonQuotas
ON Persons.PersonId = PersonQuotas.PersonId
WHERE
--Year(pk.RxFill.FILL_DATE) >= Year(GetDate())
PersonQuotas.QuotaYear = cte1.QuotaYear
and PersonQuotas.QuotaMonth = cte1.quotaMonth
WITH Ordinal (PersonID, QuotaYear, QuotaMonth, TRxAmount, QRxAmount, Ord) AS
(
SELECT PersonQuotas.PersonID, PersonQuotas.QuotaYear, PersonQuotas.QuotaMonth, PersonQuotas.TRxAmount, PersonQuotas.QRxAmount,
ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY QuotaYear DESC, QuotaMonth DESC)
FROM PersonQuotas
)
SELECT
pk.RxMain.PHARMACY_ID AS [RxMain PHARMACY_ID]
[STUFF FROM OTHER DATA TABLES]
,Ordinal.PersonID AS [Ordinal PersonID]
,Ordinal.QuotaYear
,Ordinal.QuotaMonth
,Ordinal.TRxAmount
,Ordinal.QRxAmount
FROM
pk.RxMain
INNER JOIN pk.Doctor
ON pk.RxMain.PHARMACY_ID = pk.Doctor.PHARMACY_ID AND pk.RxMain.DOCTOR_ID = pk.Doctor.DOCTOR_ID
INNER JOIN pk.Formula
ON pk.RxMain.PHARMACY_ID = pk.Formula.PHARMACY_ID AND pk.RxMain.FORMULA_ID = pk.Formula.FORMULA_ID
INNER JOIN pk.Patient
ON pk.RxMain.PHARMACY_ID = pk.Patient.PHARMACY_ID AND pk.RxMain.PATIENT_ID = pk.Patient.PATIENT_ID
INNER JOIN pk.RxFill
ON pk.RxMain.PHARMACY_ID = pk.RxFill.PHARMACY_ID AND pk.RxMain.RXMAIN_ID = pk.RxFill.RXMAIN_ID
INNER JOIN pk.Insurance
ON pk.RxFill.PHARMACY_ID = pk.Insurance.PHARMACY_ID AND pk.RxFill.INSURANCE_ID = pk.Insurance.INSURANCE_ID
INNER JOIN PersonsRepId
ON pk.Doctor.PHARMACY_ID = PersonsRepId.PharmacyId AND pk.Doctor.SALES_PERSON_ID = PersonsRepId.SalesRepId
INNER JOIN Persons
ON PersonsRepId.PersonId = Persons.PersonId
INNER JOIN Ordinal
ON Persons.PersonId = Ordinal.PersonId
WHERE
( pk.RxFill.FILL_DATE >= dateadd(year, datediff(year, 0, getdate()), 0) AND
Ordinal.Ord = 1 )