有一个脚本,其输出是一行,包含总计和一堆列。您需要按组扩展列。输出示例:

它应该如何结果的一个例子:
这只会产生一组:
SELECT * FROM(/*здесь большой скрипт*/ )tt
UNPIVOT (
gr FOR title IN(18_a,18_b)
)unpvt
如何按列拆分?
我在 2017 年看到过类似的问题,但由于 Postgres Pro 已经发布了相当多的版本,这种情况可能有所改变。所以问题是:PostgreSQL 中现在是否有一种机制可以让您在同一服务器上对本地数据库进行查询,而无需手鼓跳舞,这将与 MSSQL 一样高效?那些。一个查询使用联接从多个数据库及其表收集数据。
我到处遇到这样的查询,据说从另一个数据库加入将需要很长时间,并且由于现在计划从 MSSQL 迁移到 PostgreSQL,因此可能有必要更改 DBMS 的结构,因为有许多繁重的脚本从不同的基础提取数据并连接在一起。
如果现在一切生产力都还很糟糕,那么谁能摆脱这种情况呢?我想到的唯一一件事是创建几个数据库模式,这些模式应该像以前调用数据库一样调用,并且每个模式都从与其名称相对应的数据库中提取数据。
花了半天时间,发现一个奇怪的bug,如果字段为空,同一个条目会显示两次。
class SearchPeople{
private $dsn = 'sqlsrv:Server=test\sql;Database=test;';
private $user = 'test';
private $password = 'test';
private $options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC];
private $con;
public function __construct(){
try {
$this->con=new PDO($this->dsn, $this->user, $this->password, $this->options);
} catch (PDOException $e) {
var_dump($e);
}
}
public function searchPeople(){
$sql="SELECT distinct id,sName,Name,pName,dateMan,typeDoc,serDoc,numDoc,dateDoc,contact FROM people WHERE sName = ?
AND Name = ? AND dateMan = ? AND typeDoc = ? AND numDoc = ? AND dateDoc = ? AND (pName = ? OR pName IS NULL)
AND (serDoc = ? OR serDoc IS NULL)";
$query = $this->con->prepare($sql);
$tr=['testov', 'test', '10.12.2010', '24', '555333', '01.04.2011','',''];
$query->execute($tr);
$result=$query->fetchAll(PDO::FETCH_ASSOC);
return $result;
}
}
$db=new SearchPeople();
$result=$db->searchPeople();
var_dump($result);
PHP 版本 8.3.2,MSSQL 数据库(在数据库中相同的查询显示一条记录)谁知道原因是什么以及如何修复此行为?
PS我正在添加我正在做的事情的屏幕截图;数据库中的查询(刚刚创建了一条记录(甚至为了清晰起见删除了不同的记录)
我正在执行的代码本身

结论
有一个任务是从表(MSSQL)中选择记录并按ID和DT对它们进行分组,并且如果具有相同id和DT的记录之一的字段date_end为空,则选择该记录,如果有没有该字段,则选择最大日期(需要输出end_date字段)
表结构
| ID | D.T. | 日期结束 |
|---|---|---|
| 12345 | Q2 | 无效的 |
| 12345 | Q2 | 01/01/2023 |
我尝试了这个查询,但两条记录都返回了
select ID,DT,case when date_end is NULL then null else MAX(date_end) end date_end from test
GROUP BY ID,DT,date_end
窗口函数 FIRST_VALUE 有帮助,但速度非常慢
select ID,DT,date_end from(
select ID,DT,FIRST_VALUE(date_end) OVER(ORDER BY date_end asc)date_end from test
)g
GROUP BY ID,DT,date_end
还有哪些其他选择?
ps 感谢@Akina 的回答,最终的请求结果是这样的:
select ID, DT, date_end from (
SELECT ID, DT, date_end,
ROW_NUMBER() OVER (PARTITION BY ID, DT ORDER BY date_end asc) rn
FROM test
)cte
WHERE rn = 1;
此设计的运行速度比 FIRST_VALUE 快得多
我知道使用字段关系可以更新或删除相关表中的数据。当我创建依赖于组织员工的用户表结构时,我使用了这种方法。当组织的员工离开时,他会自动从用户表中删除。但我对另一面感兴趣。假设有一个表 peoples,其中所有流行数据都是姓名、性别、出生年份、SNILS、护照、保险单,以及残疾群体、电话号码、电子邮件等数据。假设可能有更多字段,并且其中可能有也可能没有数据,就像相同的电话号码、电子邮件或残障群体一样。创建单独的表(例如电话)并根据人员 ID 建立连接是否有意义?将所有数据存储在一张表中的优点和缺点是什么?因为,例如,在选择电话时,在任何情况下都需要将它们组合成分隔字符串(例如;)或数组。然后你还可以使用“;”记下一个人的电话号码。并且不必费心连接并创建额外的表。
我完全理解当客户端->订单和其他之间存在连接时,当在属于一个客户端的大量数据行上建立连接时,但是如果一个字段只能有一小部分值该怎么办,这可以完美地适应同一个 varchar 字段吗?
每次为不同的页面编写通用函数但具有相同的目标时,都需要检查页面上是否存在对象并进行后续赋值并使用它。设计相当单调、繁琐:
if(document.getElementById('modal')){
modal=document.getElementById('modal');
//дальше работа уже с существующим объектом
}
该条目有较短的版本吗?
PS 在条件本身中赋值是否正确?
<input type="text" value="5" id="inp">
<script>
if (inp=document.getElementById('inp')) { console.log(inp.value) }
</script>
我编写了以下代码,它接收数据并在单击时从数组中剪切 10 个元素:
let url = 'https://dummyjson.com/products?limit=100';//откуда берём JSON данные
let rows_on_page=10;//количество строк на страницу
window.onload = function() {
pag();
};
async function pag(number_current_page=1)
{
fetch(url,{
method:'GET',
headers: {
'Content-Type': 'text/html;charset=utf-8'
},
})
.then((response) => response.json())
.then((data) => {
let offset=number_current_page*rows_on_page;
let current_list=offset-rows_on_page;
all_count_rows=Object.values(data)[0].length;//общее количество строк запроса
for (var key in data.products.slice(current_list,offset)) {
index=Number(key)+current_list;
i=index+1;
console.log(data.products[index]['title']);
}
})
}
<!DOCTYPE html>
<html>
<head>
<title>pag</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
</head>
<body>
<nav class="pagination justify-content-center">
<ul class="pagination">
<li class="page-item disabled" onclick="pag(1)">
<a class="page-link" href="#"> |< </a>
</li>
<li class="page-item disabled" onclick="pag(1)">
<a class="page-link" href="#">Назад</a>
</li>
<li class="page-item active " onclick="pag(this.textContent)">
<a class="page-link" href="#">1</a>
</li>
<li class="page-item " onclick="pag(this.textContent)">
<a class="page-link" href="#">2</a>
</li>
<li class="page-item " onclick="pag(this.textContent)">
<a class="page-link" href="#">3</a>
</li>
<li class="page-item " onclick="pag(this.textContent)">
<a class="page-link" href="#">4</a>
</li>
<li class="page-item " onclick="pag(this.textContent)">
<a class="page-link" href="#">5</a>
</li>
<li class="page-item " onclick="pag(2)">
<a class="page-link" href="#">Далее</a>
</li>
<li class="page-item " onclick="pag(10)">
<a class="page-link" href="#"> >| </a>
</li>
</ul>
</nav>
<script src="ft.js"></script>
</body>
</html>
但是每次点击,都会访问 url 并读取数据。如何获取数据 1 次并使用它不断切割 10 个元素进行输出?