我有一張僱員支付表。他們走動了很多,我需要總結的數據發現:T-SQL DENSE_RANK - 不完全
一)在工作間隙日期 b)工作地點的)島嶼 ç算星期的島嶼
這聽起來相當平直向前,但它讓我發瘋。
到目前爲止,我有一個查詢,它獲取最小和最大payment_date之間的所有可能支付日期。然後我加入付款文件。然後我需要總結這些數據,忽略薪酬差距不到3周。
這裏是我到目前爲止的代碼(我已經離開的一些多餘的東西):
declare @Start date declare @End date
select @Start=(select min(pay_date) from Location_ANALYSIS where ni_code='AN NI Number'), @End=(select max(pay_date) from Location_ANALYSIS where ni_code='AN NI Number')
WITH sample AS (
SELECT @Start AS dt
UNION ALL
SELECT DATEADD(dd, 7, dt)
FROM sample
WHERE DATEADD(dd, 7, dt) <= @End)
select sample.dt, isnull(o.Location_id,'{unknown}') as Location, sum(isnull(gross_pay,0)),isnull(cast(min(pay_date) as date),dt) as FirstDate,isnull(cast(dateadd(d,6,min(pay_date)) as date),dateadd(d,6,dt)) as LastDate
,GroupSequence = DENSE_RANK() over (order by isnull(o.Location_id,'{unknown}'))
from sample
left outer join Location_ANALYSIS o on o.PAY_DATE>=sample.dt and o.PAY_DATE<=DATEADD(d,6,sample.dt) and o.NI_CODE='AN NI Number'
group by isnull(o.Location_id,'{unknown}'),sample.dt
order by sample.dt
這給了我這個名單:
dt Location(No column name) FirstDate LastDate GroupSequence
2012-04-06 LONDON 900.75 2012-04-06 2012-04-12 2
2012-04-13 LONDON 555.75 2012-04-13 2012-04-19 2
2012-04-20 LONDON 244.53 2012-04-20 2012-04-26 2
2012-04-27 LONDON 524.58 2012-04-27 2012-05-03 2
2012-05-04 LONDON 500.58 2012-05-04 2012-05-10 2
2012-05-11 LONDON 467.58 2012-05-11 2012-05-17 2
2012-05-18 LONDON 258.78 2012-05-18 2012-05-24 2
2012-05-25 LONDON 479.58 2012-05-25 2012-05-31 2
2012-06-01 {unknown} 0.00 2012-06-01 2012-06-07 1
2012-06-08 {unknown} 0.00 2012-06-08 2012-06-14 1
2012-06-15 {unknown} 0.00 2012-06-15 2012-06-21 1
2012-06-22 {unknown} 0.00 2012-06-22 2012-06-28 1
2012-06-29 {unknown} 0.00 2012-06-29 2012-07-05 1
2012-07-06 LONDON 186.08 2012-07-06 2012-07-12 2
2012-07-13 {unknown} 0.00 2012-07-13 2012-07-19 1
2012-07-20 {unknown} 0.00 2012-07-20 2012-07-26 1
2012-07-27 {unknown} 0.00 2012-07-27 2012-08-02 1
2012-08-03 {unknown} 0.00 2012-08-03 2012-08-09 1
2012-08-10 {unknown} 0.00 2012-08-10 2012-08-16 1
2012-08-17 LONDON 767.58 2012-08-17 2012-08-23 2
2012-08-24 LONDON 758.58 2012-08-24 2012-08-30 2
2012-08-31 LONDON 794.58 2012-08-31 2012-09-06 2
2012-09-07 LONDON 389.58 2012-09-07 2012-09-13 2
2012-09-14 LONDON 428.58 2012-09-14 2012-09-20 2
2012-09-21 LONDON 629.58 2012-09-21 2012-09-27 2
2012-09-28 LONDON 734.58 2012-09-28 2012-10-04 2
我的問題是我現在的位置需要組但是可以重複該位置,因此不能使用DENSE_RANK()值進行分組。
我需要這樣的數據:
dt Location (No column name) FirstDate LastDate GroupSequence
2012-04-06 LONDON 900.75 2012-04-06 2012-04-12 1
2012-04-13 LONDON 555.75 2012-04-13 2012-04-19 1
2012-04-20 LONDON 244.53 2012-04-20 2012-04-26 1
2012-04-27 LONDON 524.58 2012-04-27 2012-05-03 1
2012-05-04 LONDON 500.58 2012-05-04 2012-05-10 1
2012-05-11 LONDON 467.58 2012-05-11 2012-05-17 1
2012-05-18 LONDON 258.78 2012-05-18 2012-05-24 1
2012-05-25 LONDON 479.58 2012-05-25 2012-05-31 1
2012-06-01 {unknown} 0.00 2012-06-01 2012-06-07 2
2012-06-08 {unknown} 0.00 2012-06-08 2012-06-14 2
2012-06-15 {unknown} 0.00 2012-06-15 2012-06-21 2
2012-06-22 {unknown} 0.00 2012-06-22 2012-06-28 2
2012-06-29 {unknown} 0.00 2012-06-29 2012-07-05 2
2012-07-06 LONDON 186.08 2012-07-06 2012-07-12 3
2012-07-13 {unknown} 0.00 2012-07-13 2012-07-19 4
2012-07-20 {unknown} 0.00 2012-07-20 2012-07-26 4
2012-07-27 {unknown} 0.00 2012-07-27 2012-08-02 4
2012-08-03 {unknown} 0.00 2012-08-03 2012-08-09 4
2012-08-10 {unknown} 0.00 2012-08-10 2012-08-16 4
2012-08-17 LONDON 767.58 2012-08-17 2012-08-23 5
2012-08-24 LONDON 758.58 2012-08-24 2012-08-30 5
2012-08-31 LONDON 794.58 2012-08-31 2012-09-06 5
2012-09-07 LONDON 389.58 2012-09-07 2012-09-13 5
2012-09-14 LONDON 428.58 2012-09-14 2012-09-20 5
2012-09-21 LONDON 629.58 2012-09-21 2012-09-27 5
2012-09-28 LONDON 734.58 2012-09-28 2012-10-04 5
這樣我就可以通過計算組項目由GroupSequence和組忽略子3個星期的差距。
最後,我想產生這樣:
Location START_DATE END_DATE PERIOD TURNOVER
London 2012-04-06 2012-05-31 8 3932.13
{unknown} 2012-06-01 2012-07-05 5 0.00
London 2012-07-06 2012-07-05 0 186.08
{unknown} 2012-07-13 2012-08-16 5 0.00
London 2012-08-17 2012-10-04 7 4503.06
對於它的價值,我有已經在使用遊標和大量迭代的這個工作,但也有150萬條的付款記錄現在,我拼命地試圖通過裝箱遊標來加快速度。
我希望這是有道理的
哪個版本的SQL Server?鉛/滯後(2012年)會有所幫助。否則,你可能最終會自動加入子查詢來尋找休息時間。 – JAQFrost