postgresql 使用ROW_NUMBER的POSTGRES ORDER BY random()未按预期工作

fd3cxomn  于 12个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(265)
let data = await Category.findAll({
  where: { list_category_id: body.category_id },
  attributes: {
    include: [
      [
        sequelize.literal(`COALESCE (
          CASE WHEN youtube_id_id IS NOT NULL THEN ROW_NUMBER() OVER (ORDER BY random(), youtube_id_id) END,
          CASE WHEN instagram_id_id IS NOT NULL THEN ROW_NUMBER() OVER (ORDER BY random(), instagram_id_id) END )`),
        "row_num",
      ],
    ],
  },
  order: [sequelize.literal("row_num")],
});

字符串
在一行中,只有一个会有一个值youtube_id_id或Instagram_id_id,我想出了这个,这样我就可以得到的行与值都为youtube_id_id和Instagram_id_id列每一次,但这只工作没有随机()在ORDER BY。我想得到随机结果,每次我运行这个,并在同一时间确保行与两个值都存在。我如何才能使这工作?
编辑:
类别表:

export const Category = sequelize.define(
  "category",
  {
    id: {
      type: DataTypes.UUID,
      defaultValue: sequelize.literal("gen_random_uuid()"),
      primaryKey: true,
    },
    score: {
      type: DataTypes.FLOAT,
      allowNull: false,
    },
    createdAt: {
      type: DataTypes.DATE,
      defaultValue: sequelize.literal("NOW()"),
    },
    updatedAt: {
      type: DataTypes.DATE,
      defaultValue: sequelize.literal("NOW()"),
    },
  },
  {
    underscored: true,
    tableName: "Category",
  }
);


youtube_id_idinstagram_id_id是外键。
样本数据:
| ID| youtube_id_id| Instagram_id_id|
| --|--|--|
| UUID||UUID|
| UUID| UUID||
| UUID| UUID||
| UUID||UUID|
Expected Output有点难以描述,我需要每个外键的数据,比如我将数据限制为2,所以我应该总是得到两个键都有值的行。
基本上我认为我想要的是,当ROW_NUMBER()编号从1开始而不是从第一行开始时,它会给它分配一个随机行并继续下去。这应该会随机得到我的结果,有没有办法实现这一点?

7cjasjjr

7cjasjjr1#

我修复了它,只是不得不按列分区和随机分组。

COALESCE (CASE WHEN youtube_id_id IS NOT NULL THEN ROW_NUMBER() OVER (PARTITION BY youtube_id_id IS NOT NULL ORDER BY random()) END,
          CASE WHEN instagram_id_id IS NOT NULL THEN ROW_NUMBER() OVER (PARTITION BY youtube_id_id IS NOT NULL ORDER BY random()) END)

字符串

mzaanser

mzaanser2#

我想在每次运行时都得到随机结果,同时确保具有这两个值的行都存在。
您可以进行两个查询,然后对它们进行union

(
select *
from your_table
where youtube_id is null
  and instagram_id is not null
order by random()
limit 1
)

union

(
select *
from your_table
where youtube_id is not null 
  and instagram_id is null
order by random()
limit 1
)

字符串
Demonstration的一个。
Sequelize并不直接支持union,但您可以通过combining two queries with a Promise.all来模拟它。

相关问题