سؤال

ولدي تطبيق بايثون. أنه يحتوي على قاعدة بيانات SQLite، والكامل للبيانات عن الأشياء التي تحدث، التي تم استردادها بواسطة مكشطة الويب من الويب. تتضمن هذه البيانات جماعات الوقت تاريخه، والطوابع يونكس، في عمود المخصصة لهم. أريد أن استرداد أسماء المنظمات التي فعلت اشياء ونحصي غالبا ما فعلوه لهم، ولكن للقيام بذلك لكل أسبوع (أي 604،800 ثانية) لدي بيانات ل.

وشبة الكود:

for each 604800-second increment in time:
 select count(time), org from table group by org

وأساسا ما أحاول القيام به هو تكرار خلال قاعدة البيانات مثل قائمة تم فرزها على العمود الوقت، بقيمة خطوة من 604800. والهدف هو تحليل كيفية توزيع منظمات مختلفة في مجموع تغيرت مع مرور الوقت.

وإذا كان ذلك ممكنا، أود أن تجنب سحب كافة الصفوف من ديسيبل ومعالجتها في بيثون كما يبدو أ) عدم كفاءة وب) إعطاء ربما من العبث أن البيانات في قاعدة بيانات.

هل كانت مفيدة؟

المحلول

لا يكون على دراية سكليتي وأعتقد أن هذا النهج يجب أن تعمل لمعظم قواعد البيانات، كما يجدها weeknumber ويطرح الإزاحة

SELECT org, ROUND(time/604800) - week_offset, COUNT(*)
FROM table
GROUP BY org, ROUND(time/604800) - week_offset

في أوراكل أود أن استخدام التالية إذا كان الوقت عمود التاريخ:

SELECT org, TO_CHAR(time, 'YYYY-IW'), COUNT(*)
FROM table
GROUP BY org, TO_CHAR(time, 'YYYY-IW')

وسكليتي ربما لديها وظائف مماثلة الذي يسمح هذا النوع من SELECT الذي هو أسهل على العين.

نصائح أخرى

وإنشاء جدول تسرد كل أسبوعين منذ الحقبة، وJOIN إلى الجدول الخاص بك من الأحداث.

CREATE TABLE Weeks (
  week INTEGER PRIMARY KEY
);

INSERT INTO Weeks (week) VALUES (200919); -- e.g. this week

SELECT w.week, e.org, COUNT(*)
FROM Events e JOIN Weeks w ON (w.week = strftime('%Y%W', e.time))
GROUP BY w.week, e.org;

وهناك أسابيع فقط 52-53 في السنة. حتى لو كنت تعبئة الجدول أسابيع لمدة 100 سنة، وهذا لا يزال طاولة صغيرة.

لقيام بذلك بطريقة القائمة على مجموعة (وهو ما SQL هو جيد في) سوف تحتاج إلى تمثيل قائم على مجموعة من الزيادات وقتك. يمكن أن يكون جدول مؤقت، جدول دائمة، أو جدول مشتقة (أي فرعي). أنا لست على دراية جدا مع سكليتي وانها كانت لحظة منذ ان كنت عملت مع UNIX. الطوابع الزمنية في UNIX هي فقط # ثواني منذ بعض الموعد المحدد / الوقت؟ باستخدام جدول التقويم المعياري (والذي هو من المفيد أن يكون في قاعدة بيانات) ...

SELECT
     C1.start_time,
     C2.end_time,
     T.org,
     COUNT(time)
FROM
     Calendar C1
INNER JOIN Calendar C2 ON
     C2.start_time = DATEADD(dy, 6, C1.start_time)
INNER JOIN My_Table T ON
     T.time BETWEEN C1.start_time AND C2.end_time  -- You'll need to convert to timestamp here
WHERE
     DATEPART(dw, C1.start_time) = 1 AND    -- Basically, only get dates that are a Sunday or whatever other day starts your intervals
     C1.start_time BETWEEN @start_range_date AND @end_range_date  -- Period for which you're running the report
GROUP BY
     C1.start_time,
     C2.end_time,
     T.org

والجدول التقويم يمكن أن تتخذ أيا كان الشكل الذي تريد، لذلك يمكن استخدام الطوابع UNIX في ذلك لSTART_TIME وحتى END_TIME. كنت للتو قبل ملء ذلك مع كل من التمور في أي نطاق تصور أنك قد ترغب في استخدامها. حتى الذهاب من 1900-01-01 إلى 9999-12-31 لن يكون جدول كبير بشكل رهيب. ويمكن أن تأتي في متناول اليدين لكثير من التقارير الاستفسارات نوع.

وأخيرا، هذا الرمز هو T-SQL، لذلك عليك ربما تحتاج إلى تحويل DATEPART وDATEADD إلى ما يعادل هو في SQLite.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top