編輯:下面是一組更完整的代碼,它顯示了每個答案下的具體情況。在SAS中編寫高效查詢在Teradata中使用Proc sql
libname output '/data/files/jeff'
%let DateStart = '01Jan2013'd;
%let DateEnd = '01Jun2013'd;
proc sql;
CREATE TABLE output.id AS (
SELECT DISTINCT id
FROM mydb.sale_volume AS sv
WHERE sv.category IN ('a', 'b', 'c') AND
sv.trans_date BETWEEN &DateStart AND &DateEnd
)
CREATE TABLE output.sums AS (
SELECT id, SUM(sales)
FROM mydb.sale_volue AS sv
INNER JOIN output.id AS ids
ON ids.id = sv.id
WHERE sv.trans_date BETWEEN &DateStart AND &DateEnd
GROUP BY id
)
run;
目標是簡單地根據類別成員資格查詢某個ID的表。然後我彙總這些成員在所有類別中的活動。
上述方法是遠慢於:
- 運行第一查詢以獲得所述子集
- 運行的第二查詢的總和每個ID
- 運行該內連接兩個結果的第三查詢集。
如果我的理解正確,確保所有代碼完全通過而不是交叉加載可能更有效。
發佈提問昨天之後,成員建議我可能會問,從性能上一個單獨的問題,這是更具體的,以我的情況中受益。
我正在使用SAS Enterprise Guide編寫一些程序/數據查詢。我無權修改存儲在「Teradata」中的基礎數據。
我的基本問題是在這個環境中編寫高效的SQL查詢。例如,我查詢一個大表(有數千萬條記錄),用於一小部分ID。然後,我用這個子集再次查詢大表:
proc sql;
CREATE TABLE subset AS (
SELECT
id
FROM
bigTable
WHERE
someValue = x AND
date BETWEEN a AND b
)
這個作品在幾秒鐘之內,並返回90K的ID。接下來,我想在大表中查詢這組ID,然後出現問題。我想隨着時間的推移,總結值的ID的:
proc sql;
CREATE TABLE subset_data AS (
SELECT
bigTable.id,
SUM(bigTable.value) AS total
FROM
bigTable
INNER JOIN subset
ON subset.id = bigTable.id
WHERE
bigTable.date BETWEEN a AND b
GROUP BY
bigTable.id
)
無論出於何種原因,這需要很長的時間。區別在於第一個查詢標誌爲'someValue'。第二看看所有的活動,不管'someValue'中有什麼。例如,我可以標記每個訂購披薩的顧客。然後,我會查看所有訂購披薩的顧客的每次購買。
我對SAS並不太熟悉,所以我正在尋找關於如何更有效地完成這項任務或加快速度的建議。我願意接受任何想法或建議,請告訴我是否可以提供更多細節。我想我很驚訝第二個查詢花了很長時間來處理。
優秀的答案。 –
這正是我正在尋找的。非常感謝你提供的信息。我仍然在學習SAS和Teradata,因爲我對這兩者都是新手,在我以前的工作中完成了幾乎所有的R到專有數據庫格式。我將發佈一個更完整的代碼示例,以編輯我的原始問題。我很好奇看到你做了什麼。我也會試圖找出驅動程序表的狀態。這似乎是一個好主意,尤其是我需要查詢這些數據的方式。再次,非常感謝您的建議,我真的很感激並從中吸取教訓。 –
Jeff,您的更新問題顯示您確實希望使用傳遞查詢。您現在的做法是保證整個表格必須從Teradata下載,因爲您正在加入SAS數據集。我建議你問一個新的問題,因爲這個問題的答案已經略微超出了範圍。當你這樣做時,看看你能否找到定義'mydb'的原始LIBNAME語句。 – BellevueBob