कैसे करने के लिए एक्सट्रपलेशन तारीखों में SQL सर्वर की गणना करने के लिए दैनिक मायने रखता है?

0

सवाल

इस है कितना डेटा की तरह लग रहा है. यह एक लंबे समय तालिका

enter image description here

मैं की जरूरत है की गणना करने के लिए कार्यरत लोगों की संख्या दिन से

enter image description here

कैसे लिखने के लिए SQL सर्वर तर्क करने के लिए इस परिणाम मिलता है? मैं treid बनाने के लिए एक तारीख और शामिल हो, लेकिन यह एक त्रुटि के कारण, क्योंकि तालिका बहुत बड़ा है. क्या मैं की जरूरत है एक पुनरावर्ती तर्क?

sql sql-server tsql
2021-11-23 19:56:48
4
0

भविष्य के लिए प्रश्न पोस्ट नहीं, छवियों के डेटा । इसके बजाय, का उपयोग करें की तरह एक सेवा dbfiddle. मैं किसी भी तरह जोड़ने के लिए एक स्केच के लिए एक जवाब है, के साथ एक बेहतर तैयार सवाल आप मिल सकता है एक पूरा जवाब. किसी भी तरह, यह यहाँ जाता है:

-- extrema is the least and the greatest date in staff table
with extrema(mn, mx) as (
    select least(min(hired),min(retired)) as mn
         , greatest(max(hired),max(retired)) as mx
    from staff
), calendar (dt) as (
    -- we construct a calendar with every date between extreme values
    select mn from extrema
    union all
    select dateadd(day, 1, d)
    from calendar
    where dt < (select mx from extrema)
)
-- finally we can count the number of employed people for each such date
select dt, count(1) 
from calendar c 
join staff s
    on c.dt between s.hired and s.retired
group by dt; 

यदि आप पाते हैं अपने आप को इस तरह की गणना अक्सर, यह एक अच्छा विचार है करने के लिए एक कैलेंडर बनाने की मेज. आप जोड़ सकते हैं अन्य विशेषताओं यह करने के लिए इस तरह के रूप में अगर यह एक दिन के सप्ताह के मध्य आदि ।

एक बाधा के साथ के रूप में:

CHECK(hired <= retired)

पहले भाग में सरल किया जा सकता करने के लिए:

with extrema(mn, mx) as (
    select min(hired) as mn
         , max(retired) as mx
    from staff
),
2021-11-23 20:45:14
0

यह मानते हुए वर्तमान के कर्मचारियों के लिए एक अशक्त सेवानिवृत्ति की तारीख

Declare @Date1 date = '2015-01-01'
Declare @Date2 date = getdate()

Select A.Date
      ,HeadCount = count(B.name)
 From ( Select Top (DateDiff(DAY,@Date1,@Date2)+1) 
               Date=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
         From  master..spt_values n1,master..spt_values n2
      ) A
 Left Join YourTable B on A.Date >= B.Hired and A.Date <= coalesce(B.Retired,getdate())
 Group BY A.Date
2021-11-23 20:34:49
0

आप की जरूरत है एक कैलेंडर की मेज के लिए यह. आप शुरू के साथ कैलेंडर, और छोड़ दिया के साथ जुड़ें और सब कुछ का उपयोग कर, BETWEEN तर्क है.

आप उपयोग कर सकते हैं एक असली मेज. या आप उत्पन्न कर सकते हैं, यह मक्खी पर, इस तरह:

WITH
    L0 AS ( SELECT c = 1
            FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),
                        (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ),
    L1 AS ( SELECT c = 1 FROM L0 A, L0 B, L0 C, L0 D ),
    Nums AS ( SELECT rownum = ROW_NUMBER() OVER(ORDER BY (SELECT 1))
              FROM L1 ),
    Dates AS (
      SELECT TOP (DATEDIFF(day, '20141231', GETDATE()))
        Date = DATEADD(day, rownum, '20141231')
      FROM Nums
    )

SELECT
  d.Date,
  NumEmployed = COUNT(*)
FROM Dates d
JOIN YourTable t ON d.Date BETWEEN t.Hired AND t.Retired
GROUP BY
  d.Date;

यदि आपके तारीख एक बार घटक है, तो आप की जरूरत है का उपयोग करने के लिए >= AND < तर्क

2021-11-23 20:49:37
0

कोशिश दायरे को सीमित करने, अपनी तिथि के टेबल पर. इस उदाहरण में मैं एक मेज की तारीखों का नाम TallyStickDT.

SELECT dt, COUNT(name)
FROM (
    SELECT dt
    FROM tallystickdt
    WHERE dt >= (SELECT MIN(hired) FROM #employees)
    AND dt <= GETDATE()
) A
LEFT OUTER JOIN #employees E ON A.dt >= E.Hired AND A.dt <= e.retired
GROUP BY dt
ORDER BY dt
2021-11-23 20:44:03

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में