【问题标题】:SQL ORDER BY statement for dates日期的 SQL ORDER BY 语句
【发布时间】:2021-12-23 07:17:21
【问题描述】:

我开发了一个 Python 程序,它可以读取 Excel 文件,对其执行操作,并使用 psycopg2 包和 SQL 语句将信息上传到数据库中。 这些 SQL 语句存储在一个列表中,并使用 for 循环执行:

def my_method_results_quant_rsk(input_data_frame, database_data_frame):
    combination_set = set()
    sql_querys_results_quant_rsk = []

    for index, row in database_data_frame.iterrows():
        temp_string = str(row["reference_date"]) + str(row["risk_category"]) + \
                      str(row["risk_subcategory"]) + str(row["source"])
        temp_string = ''.join(temp_string.split())
        combination_set.add(temp_string)

    for index, row in input_data_frame.iterrows():
        temp_string = str(row["date"]) + str(row["category"]) + str(row["subcategory"]) + str(row["source"])
        temp_string = ''.join(temp_string.split())

        reference_date = row['date']
        risk_category = row['category']
        risk_subcategory = row['subcategory']
        source = row['source']
        cap_limit = row['limit']
        cap_requirement = row['riskCap']
        percentage = row['percentage']

        if temp_string in combination_set:
            sql_query_results_quant_rsk_1 = f"UPDATE results_quant_rsk SET cap_limit = '{cap_limit}' WHERE reference_date = '{reference_date}' AND risk_category = '{risk_category}' AND risk_subcategory = '{risk_subcategory}' AND source = '{source}';"
            sql_query_results_quant_rsk_2 = f"UPDATE results_quant_rsk SET cap_requirement = '{cap_requirement}' WHERE reference_date = '{reference_date}' AND risk_category = '{risk_category}' AND risk_subcategory = '{risk_subcategory}' AND source = '{source}';"
            sql_query_results_quant_rsk_3 = f"UPDATE results_quant_rsk SET percentage = '{percentage}' WHERE reference_date = '{reference_date}' AND risk_category = '{risk_category}' AND risk_subcategory = '{risk_subcategory}' AND source = '{source}';"
            sql_querys_results_quant_rsk.append(sql_query_results_quant_rsk_1)
            sql_querys_results_quant_rsk.append(sql_query_results_quant_rsk_2)
            sql_querys_results_quant_rsk.append(sql_query_results_quant_rsk_3)
        else:
            sql_query_results_quant_rsk = f"INSERT INTO results_quant_rsk(reference_date, risk_category, risk_subcategory, source, cap_limit, cap_requirement, percentage) VALUES('{reference_date}', '{risk_category}', '{risk_subcategory}', '{source}', '{cap_limit}', '{cap_requirement}', '{percentage}');"
            sql_querys_results_quant_rsk.append(sql_query_results_quant_rsk)

    return sql_querys_results_quant_rsk

然后执行上面方法中创建的列表:

for sql in sqls_results_quant_rsk:
    my_cursor.execute(sql)

执行效果非常好。但是,之后我需要按日期订购数据表,但由于某种原因无法正常工作。该表称为“results_quant_rsk”,带有日期的列称为“reference_date”,类型为date NOT NULL。我试过了:

my_cursor.execute("SELECT * FROM results_quant_rsk ORDER BY reference_date;")

您可以在下面看到“reference_date”列中显然没有排序的行...

"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-07-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-08-31"
"2021-09-30"
"2021-10-31"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"
"2021-09-30"

相反,它应该按升序排列。

【问题讨论】:

  • 您正在循环中执行多个查询。这些是一个查询的结果还是全部?因为每个人都会从头开始。
  • 我正在执行多个查询,这些查询要么将条目添加到数据库,要么更新现有条目。 “每个人都会从头开始”是什么意思?
  • 我猜你显示的输出是多个 SELECT 查询的结果。每个都正确排序,但当您查看组合结果时,它们不是。
  • 为确保不会发生这种情况,order 语句不在 for 循环中执行,而是在之后执行。我还尝试关闭游标并提交所有更新更改,然后再次打开游标,执行命令语句并再次提交......没有成功......
  • 如果您无法提供minimal reproducible example,我们将无法解决此问题。

标签: python sql database psycopg2


【解决方案1】:

尝试使用特定的ASC|DESC,它将按升序对您的参考日期进行排序。如果您需要按降序排列,请尝试DESC|ASC

my_cursor.execute("SELECT * FROM results_quant_rsk ORDER BY reference_date ASC | DESC;")

或者,您也可以尝试:

my_cursor.execute("SELECT * FROM resutls_quant_rsk ORDER BY Year(reference_date), month(reference_date);")

这将使用来自reference_dateyear 和来自reference_datemonth 来订购相应的日期。

【讨论】:

  • 我已编辑您的答案以改进您的格式。请查看,以便将来您可以将类似的格式应用于您的答案。这提高了可读性,并使它们对未来的读者更有用。
  • 我尝试了您的两种解决方案。不幸的是,在运行第一个替代方案时,数据库保持相同的顺序。对于第二种选择,我收到以下错误: psycopg2.errors.UndefinedFunction: function year(date) does not exist LINE 1: SELECT * FROM results_qual_rsk ORDER BY Year(reference_date)... ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
  • 你能把它的截图发给我吗
  • 我很想,但我不知道如何在这里发送私人消息。我也无法将屏幕截图附加到评论...:D
  • ASC 是默认值,您不需要明确指定。
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2012-04-21
相关资源
最近更新 更多